Autor Beitrag
Roefe68
Hält's aus hier
Beiträge: 2

WinNT Win XP
Delphi Pascal Cache
BeitragVerfasst: Do 06.10.05 23:02 
Hallo Zusammen

Suche dringen ein CRC Berechnungstool, welches mir die CRC16 eines Strings berechnen kann.
Auf folgendem Link habe ich die Lösung gefunden, aber das läuft auf einer Website ab und ich brauche Delphi-Code.

www.lammertbies.nl/c...00003&method=hex

Beim eingegebenen Wert von
HEX 00 00 00 00 03 gibt CRC-16 0x0140 zurück.

Wie kann ich mit Delphi diese CRC berechnen?

Danke für die Hilfe


Rolf
alzaimar
ontopic starontopic starontopic starontopic starontopic starontopic starontopic starofftopic star
Beiträge: 2889
Erhaltene Danke: 13

W2000, XP
D6E, BDS2006A, DevExpress
BeitragVerfasst: Do 06.10.05 23:07 
So:
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:
48:
49:
50:
51:
52:
53:
54:
55:
56:
57:
58:
59:
60:
61:
62:
63:
64:
65:
66:
67:
68:
69:
70:
71:
72:
73:
74:
75:
76:
77:
78:
79:
80:
81:
82:
83:
84:
85:
86:
87:
88:
89:
90:
91:
92:
93:
94:
95:
96:
97:
98:
99:
100:
101:
102:
103:
104:
105:
106:
107:
108:
109:
110:
111:
112:
113:
114:
115:
116:
117:
118:
119:
120:
121:
122:
123:
124:
125:
126:
127:
128:
129:
130:
131:
132:
133:
134:
135:
136:
137:
138:
139:
140:
141:
142:
143:
144:
145:
146:
147:
148:
149:
150:
151:
152:
153:
154:
155:
156:
157:
158:
159:
160:
161:
162:
163:
164:
165:
166:
167:
168:
169:
170:
171:
172:
173:
174:
175:
176:
177:
UNIT CsCrc;
interface
//
// Initial Value for CRCvalue is $FFFFFFF (by definition)
// The CRC-Value is equal to NOT CRCvalue
//
  Procedure InitCrc32 (Var CRCvalue          :  Cardinal);
  Procedure NextCrc32      (B         : Byte;
           Var CRCvalue          :  Cardinal);
  Procedure DoneCrc32 (Var CRCvalue          :  Cardinal);

  Procedure InitCrc16 (Var CRCvalue          :  Word);
  Procedure NextCrc16      (B         : Byte;
           Var CRCvalue          :  Word);
  Procedure DoneCrc16 (Var CRCvalue          :  Word);

  Function CRC32FromString (Const aString : String) : Cardinal;
  Function CRC16FromString (Const aString : String) : Word;
Implementation
Const
  Table32:  Array[Byte] Of Cardinal =
   ($00000000$77073096$EE0E612C$990951BA,
    $076DC419$706AF48F$E963A535$9E6495A3,
    $0EDB8832$79DCB8A4$E0D5E91E$97D2D988,
    $09B64C2B$7EB17CBD$E7B82D07$90BF1D91,
    $1DB71064$6AB020F2$F3B97148$84BE41DE,
    $1ADAD47D$6DDDE4EB$F4D4B551$83D385C7,
    $136C9856$646BA8C0$FD62F97A$8A65C9EC,
    $14015C4F$63066CD9$FA0F3D63$8D080DF5,
    $3B6E20C8$4C69105E$D56041E4$A2677172,
    $3C03E4D1$4B04D447$D20D85FD$A50AB56B,
    $35B5A8FA$42B2986C$DBBBC9D6$ACBCF940,
    $32D86CE3$45DF5C75$DCD60DCF$ABD13D59,
    $26D930AC$51DE003A$C8D75180$BFD06116,
    $21B4F4B5$56B3C423$CFBA9599$B8BDA50F,
    $2802B89E$5F058808$C60CD9B2$B10BE924,
    $2F6F7C87$58684C11$C1611DAB$B6662D3D,

    $76DC4190$01DB7106$98D220BC$EFD5102A,
    $71B18589$06B6B51F$9FBFE4A5$E8B8D433,
    $7807C9A2$0F00F934$9609A88E$E10E9818,
    $7F6A0DBB$086D3D2D$91646C97$E6635C01,
    $6B6B51F4$1C6C6162$856530D8$F262004E,
    $6C0695ED$1B01A57B$8208F4C1$F50FC457,
    $65B0D9C6$12B7E950$8BBEB8EA$FCB9887C,
    $62DD1DDF$15DA2D49$8CD37CF3$FBD44C65,
    $4DB26158$3AB551CE$A3BC0074$D4BB30E2,
    $4ADFA541$3DD895D7$A4D1C46D$D3D6F4FB,
    $4369E96A$346ED9FC$AD678846$DA60B8D0,
    $44042D73$33031DE5$AA0A4C5F$DD0D7CC9,
    $5005713C$270241AA$BE0B1010$C90C2086,
    $5768B525$206F85B3$B966D409$CE61E49F,
    $5EDEF90E$29D9C998$B0D09822$C7D7A8B4,
    $59B33D17$2EB40D81$B7BD5C3B$C0BA6CAD,

    $EDB88320$9ABFB3B6$03B6E20C$74B1D29A,
    $EAD54739$9DD277AF$04DB2615$73DC1683,
    $E3630B12$94643B84$0D6D6A3E$7A6A5AA8,
    $E40ECF0B$9309FF9D$0A00AE27$7D079EB1,
    $F00F9344$8708A3D2$1E01F268$6906C2FE,
    $F762575D$806567CB$196C3671$6E6B06E7,
    $FED41B76$89D32BE0$10DA7A5A$67DD4ACC,
    $F9B9DF6F$8EBEEFF9$17B7BE43$60B08ED5,
    $D6D6A3E8$A1D1937E$38D8C2C4$4FDFF252,
    $D1BB67F1$A6BC5767$3FB506DD$48B2364B,
    $D80D2BDA$AF0A1B4C$36034AF6$41047A60,
    $DF60EFC3$A867DF55$316E8EEF$4669BE79,
    $CB61B38C$BC66831A$256FD2A0$5268E236,
    $CC0C7795$BB0B4703$220216B9$5505262F,
    $C5BA3BBE$B2BD0B28$2BB45A92$5CB36A04,
    $C2D7FFA7$B5D0CF31$2CD99E8B$5BDEAE1D,

    $9B64C2B0$EC63F226$756AA39C$026D930A,
    $9C0906A9$EB0E363F$72076785$05005713,
    $95BF4A82$E2B87A14$7BB12BAE$0CB61B38,
    $92D28E9B$E5D5BE0D$7CDCEFB7$0BDBDF21,
    $86D3D2D4$F1D4E242$68DDB3F8$1FDA836E,
    $81BE16CD$F6B9265B$6FB077E1$18B74777,
    $88085AE6$FF0F6A70$66063BCA$11010B5C,
    $8F659EFF$F862AE69$616BFFD3$166CCF45,
    $A00AE278$D70DD2EE$4E048354$3903B3C2,
    $A7672661$D06016F7$4969474D$3E6E77DB,
    $AED16A4A$D9D65ADC$40DF0B66$37D83BF0,
    $A9BCAE53$DEBB9EC5$47B2CF7F$30B5FFE9,
    $BDBDF21C$CABAC28A$53B39330$24B4A3A6,
    $BAD03605$CDD70693$54DE5729$23D967BF,
    $B3667A2E$C4614AB8$5D681B02$2A6F2B94,
    $B40BBE37$C30C8EA1$5A05DF1B$2D02EF8D);



  Table16 : Array [Byte] Of Word = (
    $0000,$C0C1,$C181,$0140,$C301,$03C0,$0280,$C241,
    $C601,$06C0,$0780,$C741,$0500,$C5C1,$C481,$0440,
    $CC01,$0CC0,$0D80,$CD41,$0F00,$CFC1,$CE81,$0E40,
    $0A00,$CAC1,$CB81,$0B40,$C901,$09C0,$0880,$C841,
    $D801,$18C0,$1980,$D941,$1B00,$DBC1,$DA81,$1A40,
    $1E00,$DEC1,$DF81,$1F40,$DD01,$1DC0,$1C80,$DC41,
    $1400,$D4C1,$D581,$1540,$D701,$17C0,$1680,$D641,
    $D201,$12C0,$1380,$D341,$1100,$D1C1,$D081,$1040,
    $F001,$30C0,$3180,$F141,$3300,$F3C1,$F281,$3240,
    $3600,$F6C1,$F781,$3740,$F501,$35C0,$3480,$F441,
    $3C00,$FCC1,$FD81,$3D40,$FF01,$3FC0,$3E80,$FE41,
    $FA01,$3AC0,$3B80,$FB41,$3900,$F9C1,$F881,$3840,
    $2800,$E8C1,$E981,$2940,$EB01,$2BC0,$2A80,$EA41,
    $EE01,$2EC0,$2F80,$EF41,$2D00,$EDC1,$EC81,$2C40,
    $E401,$24C0,$2580,$E541,$2700,$E7C1,$E681,$2640,
    $2200,$E2C1,$E381,$2340,$E101,$21C0,$2080,$E041,
    $A001,$60C0,$6180,$A141,$6300,$A3C1,$A281,$6240,
    $6600,$A6C1,$A781,$6740,$A501,$65C0,$6480,$A441,
    $6C00,$ACC1,$AD81,$6D40,$AF01,$6FC0,$6E80,$AE41,
    $AA01,$6AC0,$6B80,$AB41,$6900,$A9C1,$A881,$6840,
    $7800,$B8C1,$B981,$7940,$BB01,$7BC0,$7A80,$BA41,
    $BE01,$7EC0,$7F80,$BF41,$7D00,$BDC1,$BC81,$7C40,
    $B401,$74C0,$7580,$B541,$7700,$B7C1,$B681,$7640,
    $7200,$B2C1,$B381,$7340,$B101,$71C0,$7080,$B041,
    $5000,$90C1,$9181,$5140,$9301,$53C0,$5280,$9241,
    $9601,$56C0,$5780,$9741,$5500,$95C1,$9481,$5440,
    $9C01,$5CC0,$5D80,$9D41,$5F00,$9FC1,$9E81,$5E40,
    $5A00,$9AC1,$9B81,$5B40,$9901,$59C0,$5880,$9841,
    $8801,$48C0,$4980,$8941,$4B00,$8BC1,$8A81,$4A40,
    $4E00,$8EC1,$8F81,$4F40,$8D01,$4DC0,$4C80,$8C41,
    $4400,$84C1,$8581,$4540,$8701,$47C0,$4680,$8641,
    $8201,$42C0,$4380,$8341,$4100,$81C1,$8081,$4040);

Procedure InitCrc32;
Begin
  CRCValue := $FFFFFFFF;
End;

Procedure NextCrc32;
Begin
  CRCvalue := (CRCvalue SHR 8)  XOR Table32[b XOR (CRCvalue AND $000000FF)];
End;

Procedure DoneCrc32;
Begin
  CRCvalue := NOT CRCvalue;
End;

Procedure InitCrc16;
Begin
  CRCValue := $FFFF;
End;

Procedure NextCrc16;
Begin
  CRCvalue := (CRCvalue SHR 8)  XOR Table16[b XOR (CRCvalue AND $00FF)];
End;

Procedure DoneCrc16;
Begin
  CRCvalue := NOT CRCvalue;
End;

Function CRC32FromString (Const aString : String) : Cardinal;
Var
  i : Integer;

Begin
  InitCrc32(Result);
  For i:=1 to Length (aString) do
    NextCrc32 (Ord (aString[i]), Result);
  DoneCrc32(Result)
End;

Function CRC16FromString (Const aString : String) : Word;
Var
  i : Integer;

Begin
  InitCrc16(Result);
  For i:=1 to Length (aString) do
    NextCrc16 (Ord (aString[i]), Result);
  DoneCrc16(Result)
End;
End.

_________________
Na denn, dann. Bis dann, denn.
Roefe68 Threadstarter
Hält's aus hier
Beiträge: 2

WinNT Win XP
Delphi Pascal Cache
BeitragVerfasst: Fr 07.10.05 10:15 
Hallo Alzaimar

Danke für die Antwort. Ich habe die Unit eingebaut, aber offensichtlich mach ich etwas falsch.
ausblenden Delphi-Quelltext
1:
2:
3:
4:
5:
6:
7:
8:
9:
var  CRC         : Word;
     Sendestring : String;

begin
  SendeString:=#0#0#0#0#3;
  //CRC Berechnen
  CRC:=CRC16FromString(SendeString);
  SendeString:=SendeString+(inttostr(CRC));
end;


Die CRC müsste ja in diesem Beispiel #64#01 sein.
Der Sendestring wäre dann #0#0#0#0#3#64#01

Idee
alzaimar
ontopic starontopic starontopic starontopic starontopic starontopic starontopic starofftopic star
Beiträge: 2889
Erhaltene Danke: 13

W2000, XP
D6E, BDS2006A, DevExpress
BeitragVerfasst: Di 11.10.05 20:27 
IntToStr ist hier falsch. Wenn Du das 16-Bit Ergebnis binär schicken willst, müsstest Du die beiden Bytes hinten an den String 'kleben': Länge um 2 erhöhen und dann per Move die 2 Bytes anhängen:
ausblenden Delphi-Quelltext
1:
2:
SetLength (aString, Length (aString) + 2);
Move (CRC, aString[Length (aString)-1],2);

_________________
Na denn, dann. Bis dann, denn.