Autor Beitrag
FinnX
Hält's aus hier
Beiträge: 3



BeitragVerfasst: So 04.02.07 19:12 
hallo,

ich habe schon verschiedene sachen probiert aber bin zu noch keiner lösung gekommen:

ich benötige eine pascal-umsetzung der foxpro-funktion "sys(2007)" (prüfsummenberechnung).
soweit ich das in erfahrung gebracht müsste diese nach dem crc16-prinzip funktionieren, aber da erhalte ich in delphi-umsetzungen (quelltexte aus dem netz) andere werte.

wär schön wenn mir da jemand helfen könnte.

DiV Daniel
mkinzler
ontopic starontopic starontopic starontopic starontopic starontopic starontopic starofftopic star
Beiträge: 4106
Erhaltene Danke: 13


Delphi 2010 Pro; Delphi.Prism 2011 pro
BeitragVerfasst: So 04.02.07 19:19 
Je nach Parameterwahl wird crc16 oder crc32 verwendet
msdn2.microsoft.com/...csfkkhcy(VS.80).aspx

_________________
Markus Kinzler.
FinnX Threadstarter
Hält's aus hier
Beiträge: 3



BeitragVerfasst: Sa 17.02.07 13:47 
Erstmal Danke für die Hilfe,

allerdings konnte ich mein Problem so nicht lösen. Die FoxPro Version die ich habe, nutzt laut Microsoft (siehe Link von mkinzler) CRC16.
Mit allen Delphi-Umsetzungen komme ich allerdings auf andere Werte.

Als Beispiel:
Der (FoxPro)Befehl SYS(2007,'15551') liefert die Prüfsumme 54616 und
über die CRC-Funktion von umni bzw. das Programm von efg komme ich auf andere Werte.

Ich weiß nicht ob ich hier irgendwas übersehe, aber ich glaube foxpro hat für Zeichenausdrücke andere Bitfolgen als Delphi was unterschiedliche Prüfsummen wahrscheinlich macht.

Wäre schön wenn sich nochmal jemand der Sache annehmen könnte.

DiV Daniel
Grenzgaenger
Ehemaliges Mitglied
Erhaltene Danke: 1



BeitragVerfasst: Sa 17.02.07 18:00 
für was brauchst du denn die prüfziffern wie foxpro?

wenn du die alten daten verwenden willst und die logik zukünftig mit delphi abbilden willst, dann schmeiss doch das alte raus und implementier 'n neuen algo. für die übergangszeit kannst ja noch die alten werte zwischenspeichern und mit den benutzereingaben vergleichen.

wär das eine lösung?
FinnX Threadstarter
Hält's aus hier
Beiträge: 3



BeitragVerfasst: Mo 19.02.07 20:09 
Das hilft mir leider auch nicht weiter.

Mein Ziel ist folgendes:
Ein Bekannter nutzt im Mehrplatzbetrieb ein System das er gern seinen Wünschen angepasst haben möchte (aus Lizenz- und Kostengründen soll es ein neues Programm sein). Nun nutzt dieses Programm in seiner Datenbank die Prüfsumme aus allen Einträgen eines Datensatzes zum Vergleich der Korrektheit. (Warum das so ist weiss ich nicht, da ein Datensatz in Bearbeitung für andere Nutzer sowieso gesperrt ist)
Ich war schon froh herauszukriegen wie die Prüfsumme gebildet wird, da ich mich in FoxPro nicht wirklich auskenne.

Mein Bekannter und ich waren uns einig, dass neue Programm schrittweise einzuführen um einen reibungslosen Betrieb zu gewährleisten. Mit den Datenbanken komme ich gut zurecht aber wenn ich über das neue Programm einen Datensatz einfüge bekommt man im alten Programm eine Fehlermeldung dass der Datensatz fehlerhaft sei.

Ich habe schon von aussen Datensätze eingefügt von denen ich erst per Hand über FoxPro die Prüfsumme ermittelt habe. Da funktionierte es.

Wäre wirklich prima wenn ich Hilfe bekäme und die ganze Arbeit wegen dieser Hürde nicht umsonst wäre.
Grenzgaenger
Ehemaliges Mitglied
Erhaltene Danke: 1



BeitragVerfasst: Di 20.02.07 22:56 
tja, dann wird dir wohl nur 'ne big bang einführung übrigbleiben ...

msdn2.microsoft.com/...csfkkhcy(VS.80).aspx
mkmk
ontopic starontopic starontopic starontopic starontopic starontopic starontopic starontopic star
Beiträge: 23



BeitragVerfasst: Fr 18.07.08 15:56 
Ist zwar ein ziemlich alter Beitrag, aber waere froh gewesen, wenn ich diesen Code auf dem Tablet praesentiert bekommen haette. Naja, vielleicht kann's ein anderer brauchen.
Und bitte nicht lachen: ich bin erst seit 2 Wochen im Lande Delphi.

ausblenden volle Höhe Delphi-Quelltext
1:
2:
3:
4:
5:
6:
7:
8:
9:
10:
11:
12:
13:
14:
15:
16:
17:
18:
19:
20:
21:
22:
23:
24:
25:
26:
27:
28:
29:
30:
31:
32:
33:
34:
35:
36:
37:
38:
39:
40:
41:
42:
43:
44:
45:
46:
47:
//--------------------------------
// mystep
//    crc_value  = (BYTE)(crc_value >> 8) | (crc_value << 8);
//    crc_value ^= data;
//    crc_value ^= (BYTE)(crc_value & 0xff) >> 4;
//    crc_value ^= (crc_value << 8) << 4;
//    crc_value ^= ((crc_value & 0xff) << 4) << 1;
//---------------------------------
procedure mystep( c : char);
var
  data : BYTE;
begin
  data := ORD(c);
  crc_value := swap(crc_value);
  crc_value := crc_value Xor data;
  crc_value := crc_value Xor (lo(crc_value) shr 4);
  crc_value := crc_value Xor ((crc_value shl 8shl 4);
  crc_value := crc_value Xor ((lo(crc_value) shl 4shl 1);
end;


//--------------------------------
// Crc16_String
//---------------------------------
function Crc16_String (s: String ): Word;
var
i: Integer;
begin
  crc_value := $FFFF;
  for i := 1 to Length(s) do
    mystep(s[i]);
  result := crc_value;
end;

//--------------------------------
// Crc16_Array
//---------------------------------
function Crc16_Array (s: Pointer; cnt: integer): Word;
var
i: Integer;
begin
  crc_value := $FFFF;
  for i := 0 to cnt -1 do
    mystep( PChar(LongWord(s) + i)^);

  result := crc_value;
end;


Das Resultat entspricht 1:1 dem Sys(2007) von Visual FoxPro.

Moderiert von user profile iconChristian S.: Code- durch Delphi-Tags ersetzt