Entwickler-Ecke

Sonstiges (Delphi) - hexwert immer addieren, mit was?


oOXTCOo - So 12.07.09 14:40
Titel: hexwert immer addieren, mit was?
hallo!

ich habe folgenedes problem...
ich muss für einen f-bus frame immer zu einen hexwert einen hexwert addieren, ich denke das soll die größe des zu lesenden blocks darstellen.

wie kann ich mir jetzt die differenz ausrechnen, damit ich weiß mich welchen wert immer addiert wurde?
so sehen die frames aus:

Quelltext
1:
2:
3:
4:
5:
6:
7:
8:
9:
10:
11:
12:
13:
14:
15:
16:
17:
18:
4B 13 17 00 00 00 00 00 00 00 00 00 ED 23 7E
4B 13 17 00 02 00 00 00 01 00 00 00 39 34 7E
4B 13 17 00 02 00 00 00 02 00 00 00 F4 11 7E
4B 13 17 00 02 00 00 00 03 00 00 00 4F 0D 7E
4B 13 17 00 02 00 00 00 04 00 00 00 6E 5A 7E
4B 13 17 00 02 00 00 00 05 00 00 00 D5 46 7E
4B 13 17 00 02 00 00 00 06 00 00 00 18 63 7E
4B 13 17 00 02 00 00 00 07 00 00 00 A3 7F 7E
4B 13 17 00 02 00 00 00 08 00 00 00 5A CD 7E
4B 13 17 00 02 00 00 00 09 00 00 00 E1 D1 7E
4B 13 17 00 02 00 00 00 0A 00 00 00 2C F4 7E
4B 13 17 00 02 00 00 00 0B 00 00 00 97 E8 7E
4B 13 17 00 02 00 00 00 0C 00 00 00 B6 BF 7E
4B 13 17 00 02 00 00 00 0D 00 00 00 0D A3 7E
4B 13 17 00 02 00 00 00 0E 00 00 00 C0 86 7E 
4B 13 17 00 02 00 00 00 0F 00 00 00 7B 9A 7E
4B 13 17 00 02 00 00 00 10 00 00 00 23 EB 7E
4B 13 17 00 02 00 00 00 11 00 00 00 98 F7 7E

läuft bis über 4000 commands...

das sind die gemeinten hexwerte:

Quelltext
1:
2:
3:
4:
5:
6:
7:
8:
ED 23
39 34
F4 11
4F 0D
6E 5A
D5 46
18 63
A3 7F

wie kann ich jetzt den hexwert erfahren, der benutzt wurde um zb von "ED 23" auf "39 34" zu kommen...? ich weiß das immer mit dem selben hexwert addiert wird, doch wie errechne ich den wert damit ich die schleife machen kann die mir dann die 4000 commands erstellt?

start mit:
ED 23 + fraglicher hexwert = 39 34

39 34 + fraglicher hexwert = F4 11

F4 11 + fraglicher hexwert = 4F 0D


usw... den fraglichen hexwert muss ich wissen...


bitte um hilfe!

danke...

grüße
hari

Moderiert von user profile iconNarses: Titel geändert.
Moderiert von user profile iconNarses: Überflüssige Zeilenumbrüche/Leerzeilen entfernt.


jaenicke - So 12.07.09 14:44

Du kannst einen String mit einem Hexwert mit StrToInt in eine Zahl umwandeln und normal damit rechnen. Du musst nur vor den String noch ein '$' schreiben vorher.


oOXTCOo - So 12.07.09 14:46

user profile iconjaenicke hat folgendes geschrieben Zum zitierten Posting springen:
Du kannst einen String mit einem Hexwert mit StrToInt in eine Zahl umwandeln und normal damit rechnen. Du musst nur vor den String noch ein '$' schreiben vorher.

ja die funktion habe ich am laufen...
hatte es schonmal für ein anderes prorgamm geschrieben, diese schleife verwende ich jetzt, nur weis ich nicht mehr wie ich den wert mit dem addiert wird heraus bekomme...

oder meist du, ich kann einfach beide hexwerte zu dezimal wandeln und dann subdrahieren und bekomme dann die diffrenez? die different dann wieder zurück nach hex und ich hab sie?

ich müsste ja auch direkt in hex subdrahieren können und dann direkt den hexwert bekommen oder?

ich teste das mal...

Moderiert von user profile iconNarses: Überflüssige Zeilenumbrüche/Leerzeilen entfernt.


jaenicke - So 12.07.09 14:53

Richtig. Du könntest natürlich die Subtraktion auch manuell mit den hexadezimalen Buchstaben machen.


oOXTCOo - So 12.07.09 15:08

user profile iconjaenicke hat folgendes geschrieben Zum zitierten Posting springen:
Richtig. Du könntest natürlich die Subtraktion auch manuell mit den hexadezimalen Buchstaben machen.

klappt nicht, komme nie auf dem nächsten wert des fbus frames...
komisch...

ED23 - 3934 = B3EF <<< sollte dann die differenz sein

wenn ich jetzt versuche auf 3934 zu kommen passiert das:
ED23 + B3EF = A113 sollte aber 3934 sein ?!?

ach... minus rechnen! dann komm ich drauf...
ED23 - B3EF = 3934

das dürfte rückwerts laufen mit diesem f-bus frame...

nein denkfehler, dann passt das nächste ergebnis wieder nicht :(

Moderiert von user profile iconNarses: Überflüssige Zeilenumbrüche/Leerzeilen entfernt.


jaenicke - So 12.07.09 15:12

user profile iconoOXTCOo hat folgendes geschrieben Zum zitierten Posting springen:
ED23 - 3934 = B3EF <<< sollte dann die differenz sein
Ist sie doch auch. :gruebel:
Normale Subtraktion, da kommt das doch exakt raus.


oOXTCOo - So 12.07.09 15:15

Moderiert von user profile iconNarses: Komplett-Zitat des letzten Beitrags entfernt.

ja aber die selbe summe muss ja dann wieder mit dem nächsten das: F4 11 ergebnis liefern...?

---Moderiert von user profile iconNarses: Beiträge zusammengefasst---

ich komm einfach nicht drauf... hat wer eine idee?


Xentar - So 12.07.09 16:01

Ich versteh das Problem nicht.

Du möchtest von ED 23 auf 39 34 kommen, korrekt?
3934 - ed23 = 4c11

ed23 + 4c11 = 3934

?


oOXTCOo - So 12.07.09 16:30

user profile iconXentar hat folgendes geschrieben Zum zitierten Posting springen:
Ich versteh das Problem nicht.

Du möchtest von ED 23 auf 39 34 kommen, korrekt?
3934 - ed23 = 4c11

ed23 + 4c11 = 3934

?

ja genau, und dann von 3934 weiter zu F4 11 und davon weiter 6E 5A ...

damit ich in einer schleife diese fbus frames bauen kann... es durchläuft zb 4000 mal die schleife und bei jedem durchlauf wird am anfang die sequence nummer (das funktioniert ja) verändert und der zeite wert ist diese eben.


wenns nur ein paar wären würde ichs einfach so wie sie sind nehmen, aber es sind über 4000 solche frames...

ich hatte das schonmal gebraucht, da musst ich einfach nur einen hexwert addieren, das klappt hier aber nicht... :(

Moderiert von user profile iconNarses: Überflüssige Zeilenumbrüche/Leerzeilen entfernt.


Xentar - So 12.07.09 16:45

Ich versteh das Problem immer noch nicht.

Warum klappt es hier nicht, einfach einen Hexwert zu addieren? Musst dann natürlich den Übertrag wegschmeißen, aber sonst passt das doch.
Ist doch simpelste Addition / Subtraktion.

von 3934 -> F411 wären es BADD, von F411 -> 6e5a = 7a49 usw.


oOXTCOo - So 12.07.09 16:52

Moderiert von user profile iconNarses: Komplett-Zitat des letzten Beitrags entfernt.

nein, es muss ja ein fixer wert sein, denn ich immer wieder addiere...


Quelltext
1:
2:
3:
4:
5:
6:
7:
8:
ED 23 + 4C11 =
39 34 + 4C11 = 8578 sollte aber F411 sein
F4 11 
4F 0D 
6E 5A 
D5 46 
18 63 
A3 7F

es soll so funktionieren:


Delphi-Quelltext
1:
2:
3:
4:
5:
6:
7:
for I:=0 to 4999 do begin

Value1:=Value1+Value2;

memo1.lines.add('4B 13 17 00 02 00 00 00 '+SEQUENCE+' 00 00 00 '+ inttostr(Value1)+' 7E');

end;

vereinfacht geschrieben, statt ins memo werden die werte in den buffer geschrieben und dann zum gerät gesendet, dann wird von der antwort des gerätes das ack frame gesendet, und dann wieder der nächste frame...

die hexwerte die ich brauche müssen dann immer den nächsten wert für den nächsten frame ergeben, sonst passt das ergebnis nicht bzw. nimmt das gerät das ich ansteuere den frame nicht an...

ich kann damit den speicher meines gerätes auslesen, der aber sehr gross ist und zirka 4000 frames braucht bis der speicher komplett ausgelesen ist...

ich hatte das gleich prinzip mal für nokia geräte gemacht womit man den permanent memory auslesen konnte, da funktionierte es haar genauso, nur das es mit addieren super funktioniert hat, aber hier weiß ich nicht wie ich immer auf die nächste summe komme...

es kann ja auch sein das mal mehr mal weniger frames gebaut werden müssen je nachdem wie gross der speicher ist den ich auslesen möchte...

hoffe ich habs jetzt verständlich rüber gebracht...

Moderiert von user profile iconNarses: Überflüssige Zeilenumbrüche/Leerzeilen entfernt.


Xentar - So 12.07.09 16:58

Ach, jetzt versteh ich. Sorry, denkfehler.
Es soll also immer mit dem gleichen Wert addiert werden, und nicht jedesmal neu berechnet?

Dann würd ich fast sagen: geht nicht.
Wie wir ja nun schon herausgefunden haben, sind die Abstände zwischen den Werten unterschiedlich groß.

Sicher, dass das so funktioniert? Gibt doch bestimmt ne Protokoll Spezifikation oder sowas.


oOXTCOo - So 12.07.09 17:01

Moderiert von user profile iconNarses: Komplett-Zitat des letzten Beitrags entfernt.

ja genau ;)

die befürchtung habe ich auch, aber irgendwie muss es gehen, ich habe das fbus frame gesnifft und im programm kann man einstellen von wo bis wo man auslesen möchte, der frame muss sich doch irgendwie zusammensätzten lassen?

also du meinst das es einen algo dafür geben muss? wie gesagt bei nokia geräten ist es einfach $08 immer dazu und es passt... ich werde mal den prorgammierer von qmat anschreiben, möglicherweise gibt er mir ja einen tipp...

danke trotzdem für deine hilfe, wenn dir nochwas einfallen sollte...

Moderiert von user profile iconNarses: Überflüssige Zeilenumbrüche/Leerzeilen entfernt.


Xentar - So 12.07.09 17:04

Frag den Hersteller des Gerätes, ob das Protokoll öffentlich ist, bzw. frag mal ne Suchmaschine, ob andere Leute schonmal mit diesem Gerät rumgespielt haben.


oOXTCOo - So 12.07.09 17:08

Moderiert von user profile iconNarses: Komplett-Zitat des letzten Beitrags entfernt.

habe ich schon, ist ein qualcomm chip eines usb modems... dessen efs müsste ich auslesen.

mein programm funktiniert zwar, da ich für jede firmware nun den passenden frame rausgesucht habe, ich wollte es aber so machen, so dass programm für firmware updates gerüstet ist, und einfach den komplett efs ausliest, den ich dann auswerten kann und die gewünschte position dann suchen kann.

im moment lade ich genau den teil zur passenden firmware raus und werte diesen aus, das ist aber sehr mühsam und es gibt zick firmware versionen...

das bedeutet kommt eine neue firmware raus, muss ich das programm wieder erweitern, würde ich den kompletten efs lesen können, habe ich 100% die gewünschte position drinn die ich dann nur aus dem buffer raus suchen müsste...

mir fällt da nochwas ein, ich muss mir das mal in ascii ansehen... vieleicht werden gar keine zahlen addiert, vieleicht sind es einfach nur buchstaben und es geht nach bestimmte ascii zeichen, da es doch at commands sind und keine fbus frames eigentlich...

in ascii siehts auch nach nix aus:

Quelltext
1:
2:
3:
4:
5:
6:
7:
8:
9:
10:
11:
12:
13:
14:
K...........í#~.
K...........94~.
K...........ô.~.
K...........O.~.
K...........nZ~.
K...........ÕF~.
K............c~.
K...........£.~.
K...........ZÍ~.
K...........áÑ~.
K...........,ô~.
K...........—è~.
K...........¶¿~.
K............£~.


Moderiert von user profile iconNarses: Überflüssige Zeilenumbrüche/Leerzeilen entfernt und nachfolgenden, leeren Beitrag gelöscht.


Xentar - So 12.07.09 18:26

Einen Post nachträglich unkenntlich machen, ist nicht gerade "nett"..
Hatte den noch lesen können. War eine Vermutung, dass es sich bei den Werten um eine CRC handelt.

Ob das stimmt, kann ich nicht genau sagen. Hab grad keine Lust, das nachzubauen, wäre aber auch möglich.
Für Delphi gibt es fertige Funktionen, um die CRC zu berechnen. Kansnte ja mal suchen und ausprobieren.


oOXTCOo - Mo 13.07.09 11:58

Moderiert von user profile iconNarses: Komplett-Zitat des letzten Beitrags entfernt.

ich hatte den post unleserlich gemacht, da ich vom programmierer den richitigen tipp bekommen habe und meiner flasch war... war also keine böse absicht...

ist ein crc16 ... ich habe glaube ich einen falschen crc geposted, und habe dann den richitgen gefunden, darum habe ich ihn sofort gelöscht... ums genau zu sagen: CRC16 CCITT habe mir noch nicht angeshene was da der unterschied ist...?

das sollte der richitge sein (hoffe ich):

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:
WORD crc16_table2[CRC_TAB_SIZE] =
{
   0x0000, 0x1189, 0x2312, 0x329b, 0x4624, 0x57ad, 0x6536, 0x74bf,
    0x8c48, 0x9dc1, 0xaf5a, 0xbed3, 0xca6c, 0xdbe5, 0xe97e, 0xf8f7,
    0x1081, 0x0108, 0x3393, 0x221a, 0x56a5, 0x472c, 0x75b7, 0x643e,
    0x9cc9, 0x8d40, 0xbfdb, 0xae52, 0xdaed, 0xcb64, 0xf9ff, 0xe876,
    0x2102, 0x308b, 0x0210, 0x1399, 0x6726, 0x76af, 0x4434, 0x55bd,
    0xad4a, 0xbcc3, 0x8e58, 0x9fd1, 0xeb6e, 0xfae7, 0xc87c, 0xd9f5,
    0x3183, 0x200a, 0x1291, 0x0318, 0x77a7, 0x662e, 0x54b5, 0x453c,
    0xbdcb, 0xac42, 0x9ed9, 0x8f50, 0xfbef, 0xea66, 0xd8fd, 0xc974,
    0x4204, 0x538d, 0x6116, 0x709f, 0x0420, 0x15a9, 0x2732, 0x36bb,
    0xce4c, 0xdfc5, 0xed5e, 0xfcd7, 0x8868, 0x99e1, 0xab7a, 0xbaf3,
    0x5285, 0x430c, 0x7197, 0x601e, 0x14a1, 0x0528, 0x37b3, 0x263a,
    0xdecd, 0xcf44, 0xfddf, 0xec56, 0x98e9, 0x8960, 0xbbfb, 0xaa72,
    0x6306, 0x728f, 0x4014, 0x519d, 0x2522, 0x34ab, 0x0630, 0x17b9,
    0xef4e, 0xfec7, 0xcc5c, 0xddd5, 0xa96a, 0xb8e3, 0x8a78, 0x9bf1,
    0x7387, 0x620e, 0x5095, 0x411c, 0x35a3, 0x242a, 0x16b1, 0x0738,
    0xffcf, 0xee46, 0xdcdd, 0xcd54, 0xb9eb, 0xa862, 0x9af9, 0x8b70,
    0x8408, 0x9581, 0xa71a, 0xb693, 0xc22c, 0xd3a5, 0xe13e, 0xf0b7,
    0x0840, 0x19c9, 0x2b52, 0x3adb, 0x4e64, 0x5fed, 0x6d76, 0x7cff,
    0x9489, 0x8500, 0xb79b, 0xa612, 0xd2ad, 0xc324, 0xf1bf, 0xe036,
    0x18c1, 0x0948, 0x3bd3, 0x2a5a, 0x5ee5, 0x4f6c, 0x7df7, 0x6c7e,
    0xa50a, 0xb483, 0x8618, 0x9791, 0xe32e, 0xf2a7, 0xc03c, 0xd1b5,
    0x2942, 0x38cb, 0x0a50, 0x1bd9, 0x6f66, 0x7eef, 0x4c74, 0x5dfd,
    0xb58b, 0xa402, 0x9699, 0x8710, 0xf3af, 0xe226, 0xd0bd, 0xc134,
    0x39c3, 0x284a, 0x1ad1, 0x0b58, 0x7fe7, 0x6e6e, 0x5cf5, 0x4d7c,
    0xc60c, 0xd785, 0xe51e, 0xf497, 0x8028, 0x91a1, 0xa33a, 0xb2b3,
    0x4a44, 0x5bcd, 0x6956, 0x78df, 0x0c60, 0x1de9, 0x2f72, 0x3efb,
    0xd68d, 0xc704, 0xf59f, 0xe416, 0x90a9, 0x8120, 0xb3bb, 0xa232,
    0x5ac5, 0x4b4c, 0x79d7, 0x685e, 0x1ce1, 0x0d68, 0x3ff3, 0x2e7a,
    0xe70e, 0xf687, 0xc41c, 0xd595, 0xa12a, 0xb0a3, 0x8238, 0x93b1,
    0x6b46, 0x7acf, 0x4854, 0x59dd, 0x2d62, 0x3ceb, 0x0e70, 0x1ff9,
    0xf78f, 0xe606, 0xd49d, 0xc514, 0xb1ab, 0xa022, 0x92b9, 0x8330,
    0x7bc7, 0x6a4e, 0x58d5, 0x495c, 0x3de3, 0x2c6a, 0x1ef1, 0x0f78
}
;

WORD crc_16_l_step2(WORD crc, byte data)
{
   return crc16_table2[(crc ^ data) & 0xff] ^ ((crc >> 8) & 0xFF);
}



DWORD CSerial::CalcCRC16(byte* buf_ptr, DWORD len, BOOL value)
{
    WORD eax = CRC_16_SEED;
   DWORD i=0;
   if (value) i=1;
    for (i = i; i < len; i++) eax = crc_16_l_step2(eax, buf_ptr[i]);
    eax = eax ^ CRC_16_SEED;
    return eax;
}

habt ihr sowas fertig im forum?

Moderiert von user profile iconNarses: Überflüssige Zeilenumbrüche/Leerzeilen entfernt.


Gammatester - Mo 13.07.09 12:33

Ich glaube nicht, daß Deine Angaben stimmen. Alle Deine Daten sind mit CRC-16/X-25 kompatibel. (Dein Polynom 0x1189 aus crc16_table2 wäre auch äußerst ungewöhnlich). Beschreibung zu CRC-16/X-25 u.a. hier CRC-Katalog [http://homepages.tesco.net/~rainstorm/crc-catalogue.htm] und Pascal/Delphi-Quellcode und Beispiel-EXEs hier http://home.netsurf.de/wolfgang.ehrhardt/crchash_de.html.

Gammatester


Tastaro - Mo 13.07.09 14:27

Edit: Um Verwirrung zu vermeiden entfernt.

Beste Grüße


Gammatester - Mo 13.07.09 15:01

Und was soll die Unit uCrc hier? Die crc16-Funktionen sind doch 'CRC-16/ZMODEM'. Beispielsweise liefert Deine Unit den Wert $66DC für den ersten Datensatz (statt $23ED)!

Gammatester


Gammatester - Mo 13.07.09 15:50

Hier Beispielcode mit Testwerten und -Ausgabe. Man beachte das die CRC-Werte als word ausgegeben werden, in den Originaldaten sind sie als Einzelbytes (Low/High) gegeben:


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:
program t_x25;

{$ifdef win32}
  {$apptype console}
{$endif}

{Testprogramm für <http://www.delphi-forum.de/viewtopic.php?t=93594>}
{Benutzt Units aus: <http://home.netsurf.de/wolfgang.ehrhardt/crc_hash_2009-06-06.zip>}

uses
  mem_util,crcmodel,crcm_cat;

const
  tvs: array[1..18of string = (
        '4B1317000000000000000000',
        '4B1317000200000001000000',
        '4B1317000200000002000000',
        '4B1317000200000003000000',
        '4B1317000200000004000000',
        '4B1317000200000005000000',
        '4B1317000200000006000000',
        '4B1317000200000007000000',
        '4B1317000200000008000000',
        '4B1317000200000009000000',
        '4B131700020000000A000000',
        '4B131700020000000B000000',
        '4B131700020000000C000000',
        '4B131700020000000D000000',
        '4B131700020000000E000000',
        '4B131700020000000F000000',
        '4B1317000200000010000000',
        '4B1317000200000011000000');

var
  ctx: TCRC_ctx;
  crc: longint;
  buf: array[0..100of byte;
  i,L: word;
begin
  cm_Create(CRC16_X25,nil,ctx);
  for i:=1 to 18 do begin
    Hex2Mem(tvs[i], @buf, sizeof(buf), L);
    cm_Full(ctx, CRC, @buf, L);
    writeln(ctx.name,'(',HexStr(@buf, L),')=$',HexWord(CRC));
  end;
end.


Ausgabe:


Quelltext
1:
2:
3:
4:
5:
6:
7:
8:
9:
10:
11:
12:
13:
14:
15:
16:
17:
18:
CRC-16/X-25(4b1317000000000000000000)=$23ed
CRC-16/X-25(4b1317000200000001000000)=$3439
CRC-16/X-25(4b1317000200000002000000)=$11f4
CRC-16/X-25(4b1317000200000003000000)=$0d4f
CRC-16/X-25(4b1317000200000004000000)=$5a6e
CRC-16/X-25(4b1317000200000005000000)=$46d5
CRC-16/X-25(4b1317000200000006000000)=$6318
CRC-16/X-25(4b1317000200000007000000)=$7fa3
CRC-16/X-25(4b1317000200000008000000)=$cd5a
CRC-16/X-25(4b1317000200000009000000)=$d1e1
CRC-16/X-25(4b131700020000000a000000)=$f42c
CRC-16/X-25(4b131700020000000b000000)=$e897
CRC-16/X-25(4b131700020000000c000000)=$bfb6
CRC-16/X-25(4b131700020000000d000000)=$a30d
CRC-16/X-25(4b131700020000000e000000)=$86c0
CRC-16/X-25(4b131700020000000f000000)=$9a7b
CRC-16/X-25(4b1317000200000010000000)=$eb23
CRC-16/X-25(4b1317000200000011000000)=$f798


Gammatester


Tastaro - Mo 13.07.09 15:50

user profile iconGammatester hat folgendes geschrieben Zum zitierten Posting springen:
Und was soll die Unit uCrc hier? Die crc16-Funktionen sind doch 'CRC-16/ZMODEM'. Beispielsweise liefert Deine Unit den Wert $66DC für den ersten Datensatz (statt $23ED)!

Gammatester


Hast recht. Hab nicht richtig geguckt. Sorry.


oOXTCOo - Mo 13.07.09 23:38

ach super, danke!

ich werde das gleich morgen testen, bin leider bis jetzt noch nicht dazu gekommen...

danke danke danke! :)


oOXTCOo - So 19.07.09 20:22

user profile iconGammatester hat folgendes geschrieben Zum zitierten Posting springen:
Hier Beispielcode mit Testwerten und -Ausgabe. Man beachte das die CRC-Werte als word ausgegeben werden, in den Originaldaten sind sie als Einzelbytes (Low/High) gegeben:


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:
program t_x25;

{$ifdef win32}
  {$apptype console}
{$endif}

{Testprogramm für <http://www.delphi-forum.de/viewtopic.php?t=93594>}
{Benutzt Units aus: <http://home.netsurf.de/wolfgang.ehrhardt/crc_hash_2009-06-06.zip>}

uses
  mem_util,crcmodel,crcm_cat;

const
  tvs: array[1..18of string = (
        '4B1317000000000000000000',
        '4B1317000200000001000000',
        '4B1317000200000002000000',
        '4B1317000200000003000000',
        '4B1317000200000004000000',
        '4B1317000200000005000000',
        '4B1317000200000006000000',
        '4B1317000200000007000000',
        '4B1317000200000008000000',
        '4B1317000200000009000000',
        '4B131700020000000A000000',
        '4B131700020000000B000000',
        '4B131700020000000C000000',
        '4B131700020000000D000000',
        '4B131700020000000E000000',
        '4B131700020000000F000000',
        '4B1317000200000010000000',
        '4B1317000200000011000000');

var
  ctx: TCRC_ctx;
  crc: longint;
  buf: array[0..100of byte;
  i,L: word;
begin
  cm_Create(CRC16_X25,nil,ctx);
  for i:=1 to 18 do begin
    Hex2Mem(tvs[i], @buf, sizeof(buf), L);
    cm_Full(ctx, CRC, @buf, L);
    writeln(ctx.name,'(',HexStr(@buf, L),')=$',HexWord(CRC));
  end;
end.


Ausgabe:


Quelltext
1:
2:
3:
4:
5:
6:
7:
8:
9:
10:
11:
12:
13:
14:
15:
16:
17:
18:
CRC-16/X-25(4b1317000000000000000000)=$23ed
CRC-16/X-25(4b1317000200000001000000)=$3439
CRC-16/X-25(4b1317000200000002000000)=$11f4
CRC-16/X-25(4b1317000200000003000000)=$0d4f
CRC-16/X-25(4b1317000200000004000000)=$5a6e
CRC-16/X-25(4b1317000200000005000000)=$46d5
CRC-16/X-25(4b1317000200000006000000)=$6318
CRC-16/X-25(4b1317000200000007000000)=$7fa3
CRC-16/X-25(4b1317000200000008000000)=$cd5a
CRC-16/X-25(4b1317000200000009000000)=$d1e1
CRC-16/X-25(4b131700020000000a000000)=$f42c
CRC-16/X-25(4b131700020000000b000000)=$e897
CRC-16/X-25(4b131700020000000c000000)=$bfb6
CRC-16/X-25(4b131700020000000d000000)=$a30d
CRC-16/X-25(4b131700020000000e000000)=$86c0
CRC-16/X-25(4b131700020000000f000000)=$9a7b
CRC-16/X-25(4b1317000200000010000000)=$eb23
CRC-16/X-25(4b1317000200000011000000)=$f798


Gammatester



ich bekomm da immer eine fehlermeldung (messagebox) "I/O error 105" was mache ich falsch?


oOXTCOo - So 19.07.09 21:20

okay, super es funktioniert!!!

23ed
3439
11f4
0d4f
5a6e
46d5
6318
7fa3
cd5a
d1e1
f42c
e897
bfb6
a30d
86c0
9a7b
eb23
f798


DANKE!


oOXTCOo - So 19.07.09 22:19

sorry doppelposts...

mir ist noch aufgefallen das die crc endsumme vertauscht werden muss...

so sieht nun mein fertiges ergebnis aus:

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:
178:
179:
180:
181:
182:
183:
184:
185:
186:
187:
188:
189:
190:
191:
192:
193:
194:
195:
196:
197:
198:
199:
200:
201:
202:
203:
204:
205:
206:
207:
208:
209:
210:
211:
212:
213:
214:
215:
216:
217:
218:
219:
220:
221:
222:
223:
224:
225:
226:
227:
228:
229:
230:
231:
232:
233:
234:
235:
236:
237:
238:
239:
240:
241:
242:
243:
244:
245:
246:
247:
248:
249:
250:
251:
252:
253:
254:
255:
256:
4B1317000000000000000000ED237E
4B131700020000000100000039347E
4B1317000200000002000000f4117E
4B13170002000000030000004f0d7E
4B13170002000000040000006e5a7E
4B1317000200000005000000d5467E
4B131700020000000600000018637E
4B1317000200000007000000a37f7E
4B13170002000000080000005acd7E
4B1317000200000009000000e1d17E
4B131700020000000A0000002cf47E
4B131700020000000B00000097e87E
4B131700020000000C000000b6bf7E
4B131700020000000D0000000da37E
4B131700020000000E000000c0867E
4B131700020000000F0000007b9a7E
4B131700020000001000000023eb7E
4B131700020000001100000098f77E
4B131700020000001200000055d27E
4B1317000200000013000000eece7E
4B1317000200000014000000cf997E
4B131700020000001500000074857E
4B1317000200000016000000b9a07E
4B131700020000001700000002bc7E
4B1317000200000018000000fb0e7E
4B131700020000001900000040127E
4B131700020000001A0000008d377E
4B131700020000001B000000362b7E
4B131700020000001C000000177c7E
4B131700020000001D000000ac607E
4B131700020000001E00000061457E
4B131700020000001F000000da597E
4B1317000200000020000000d1a77E
4B13170002000000210000006abb7E
4B1317000200000022000000a79e7E
4B13170002000000230000001c827E
4B13170002000000240000003dd57E
4B131700020000002500000086c97E
4B13170002000000260000004bec7E
4B1317000200000027000000f0f07E
4B131700020000002800000009427E
4B1317000200000029000000b25e7E
4B131700020000002A0000007f7b7E
4B131700020000002B000000c4677E
4B131700020000002C000000e5307E
4B131700020000002D0000005e2c7E
4B131700020000002E00000093097E
4B131700020000002F00000028157E
4B131700020000003000000070647E
4B1317000200000031000000cb787E
4B1317000200000032000000065d7E
4B1317000200000033000000bd417E
4B13170002000000340000009c167E
4B1317000200000035000000270a7E
4B1317000200000036000000ea2f7E
4B131700020000003700000051337E
4B1317000200000038000000a8817E
4B1317000200000039000000139d7E
4B131700020000003A000000deb87E
4B131700020000003B00000065a47E
4B131700020000003C00000044f37E
4B131700020000003D000000ffef7E
4B131700020000003E00000032ca7E
4B131700020000003F00000089d67E
4B1317000200000040000000353e7E
4B13170002000000410000008e227E
4B131700020000004200000043077E
4B1317000200000043000000f81b7E
4B1317000200000044000000d94c7E
4B131700020000004500000062507E
4B1317000200000046000000af757E
4B131700020000004700000014697E
4B1317000200000048000000eddb7E
4B131700020000004900000056c77E
4B131700020000004A0000009be27E
4B131700020000004B00000020fe7E
4B131700020000004C00000001a97E
4B131700020000004D000000bab57E
4B131700020000004E00000077907E
4B131700020000004F000000cc8c7E
4B131700020000005000000094fd7E
4B13170002000000510000002fe17E
4B1317000200000052000000e2c47E
4B131700020000005300000059d87E
4B1317000200000054000000788f7E
4B1317000200000055000000c3937E
4B13170002000000560000000eb67E
4B1317000200000057000000b5aa7E
4B13170002000000580000004c187E
4B1317000200000059000000f7047E
4B131700020000005A0000003a217E
4B131700020000005B000000813d7E
4B131700020000005C000000a06a7E
4B131700020000005D0000001b767E
4B131700020000005E000000d6537E
4B131700020000005F0000006d4f7E
4B131700020000006000000066b17E
4B1317000200000061000000ddad7E
4B131700020000006200000010887E
4B1317000200000063000000ab947E
4B13170002000000640000008ac37E
4B131700020000006500000031df7E
4B1317000200000066000000fcfa7E
4B131700020000006700000047e67E
4B1317000200000068000000be547E
4B131700020000006900000005487E
4B131700020000006A000000c86d7E
4B131700020000006B00000073717E
4B131700020000006C00000052267E
4B131700020000006D000000e93a7E
4B131700020000006E000000241f7E
4B131700020000006F0000009f037E
4B1317000200000070000000c7727E
4B13170002000000710000007c6e7E
4B1317000200000072000000b14b7E
4B13170002000000730000000a577E
4B13170002000000740000002b007E
4B1317000200000075000000901c7E
4B13170002000000760000005d397E
4B1317000200000077000000e6257E
4B13170002000000780000001f977E
4B1317000200000079000000a48b7E
4B131700020000007A00000069ae7E
4B131700020000007B000000d2b27E
4B131700020000007C000000f3e57E
4B131700020000007D00000048f97E
4B131700020000007E00000085dc7E
4B131700020000007F0000003ec07E
4B1317000200000080000000ec057E
4B131700020000008100000057197E
4B13170002000000820000009a3c7E
4B131700020000008300000021207E
4B131700020000008400000000777E
4B1317000200000085000000bb6b7E
4B1317000200000086000000764e7E
4B1317000200000087000000cd527E
4B131700020000008800000034e07E
4B13170002000000890000008ffc7E
4B131700020000008A00000042d97E
4B131700020000008B000000f9c57E
4B131700020000008C000000d8927E
4B131700020000008D000000638e7E
4B131700020000008E000000aeab7E
4B131700020000008F00000015b77E
4B13170002000000900000004dc67E
4B1317000200000091000000f6da7E
4B13170002000000920000003bff7E
4B131700020000009300000080e37E
4B1317000200000094000000a1b47E
4B13170002000000950000001aa87E
4B1317000200000096000000d78d7E
4B13170002000000970000006c917E
4B131700020000009800000095237E
4B13170002000000990000002e3f7E
4B131700020000009A000000e31a7E
4B131700020000009B00000058067E
4B131700020000009C00000079517E
4B131700020000009D000000c24d7E
4B131700020000009E0000000f687E
4B131700020000009F000000b4747E
4B13170002000000A0000000bf8a7E
4B13170002000000A100000004967E
4B13170002000000A2000000c9b37E
4B13170002000000A300000072af7E
4B13170002000000A400000053f87E
4B13170002000000A5000000e8e47E
4B13170002000000A600000025c17E
4B13170002000000A70000009edd7E
4B13170002000000A8000000676f7E
4B13170002000000A9000000dc737E
4B13170002000000AA00000011567E
4B13170002000000AB000000aa4a7E
4B13170002000000AC0000008b1d7E
4B13170002000000AD00000030017E
4B13170002000000AE000000fd247E
4B13170002000000AF00000046387E
4B13170002000000B00000001e497E
4B13170002000000B1000000a5557E
4B13170002000000B200000068707E
4B13170002000000B3000000d36c7E
4B13170002000000B4000000f23b7E
4B13170002000000B500000049277E
4B13170002000000B600000084027E
4B13170002000000B70000003f1e7E
4B13170002000000B8000000c6ac7E
4B13170002000000B90000007db07E
4B13170002000000BA000000b0957E
4B13170002000000BB0000000b897E
4B13170002000000BC0000002ade7E
4B13170002000000BD00000091c27E
4B13170002000000BE0000005ce77E
4B13170002000000BF000000e7fb7E
4B13170002000000C00000005b137E
4B13170002000000C1000000e00f7E
4B13170002000000C20000002d2a7E
4B13170002000000C300000096367E
4B13170002000000C4000000b7617E
4B13170002000000C50000000c7d7E
4B13170002000000C6000000c1587E
4B13170002000000C70000007a447E
4B13170002000000C800000083f67E
4B13170002000000C900000038ea7E
4B13170002000000CA000000f5cf7E
4B13170002000000CB0000004ed37E
4B13170002000000CC0000006f847E
4B13170002000000CD000000d4987E
4B13170002000000CE00000019bd7E
4B13170002000000CF000000a2a17E
4B13170002000000D0000000fad07E
4B13170002000000D100000041cc7E
4B13170002000000D20000008ce97E
4B13170002000000D300000037f57E
4B13170002000000D400000016a27E
4B13170002000000D5000000adbe7E
4B13170002000000D6000000609b7E
4B13170002000000D7000000db877E
4B13170002000000D800000022357E
4B13170002000000D900000099297E
4B13170002000000DA000000540c7E
4B13170002000000DB000000ef107E
4B13170002000000DC000000ce477E
4B13170002000000DD000000755b7E
4B13170002000000DE000000b87e7E
4B13170002000000DF00000003627E
4B13170002000000E0000000089c7E
4B13170002000000E1000000b3807E
4B13170002000000E20000007ea57E
4B13170002000000E3000000c5b97E
4B13170002000000E4000000e4ee7E
4B13170002000000E50000005ff27E
4B13170002000000E600000092d77E
4B13170002000000E700000029cb7E
4B13170002000000E8000000d0797E
4B13170002000000E90000006b657E
4B13170002000000EA000000a6407E
4B13170002000000EB0000001d5c7E
4B13170002000000EC0000003c0b7E
4B13170002000000ED00000087177E
4B13170002000000EE0000004a327E
4B13170002000000EF000000f12e7E
4B13170002000000F0000000a95f7E
4B13170002000000F100000012437E
4B13170002000000F2000000df667E
4B13170002000000F3000000647a7E
4B13170002000000F4000000452d7E
4B13170002000000F5000000fe317E
4B13170002000000F600000033147E
4B13170002000000F700000088087E
4B13170002000000F800000071ba7E
4B13170002000000F9000000caa67E
4B13170002000000FA00000007837E
4B13170002000000FB000000bc9f7E
4B13170002000000FC0000009dc87E
4B13170002000000FD00000026d47E
4B13170002000000FE000000ebf17E
4B13170002000000FF00000050ed7E


Gammatester - So 19.07.09 22:47

Das liegt daran, daß in den Daten die 16-Bit-Werte als einzelne Bytes dargestellt werden. Bei Ausgabe als Word sieht es so aus, als wenn die Bytes verdreht sind. Bei Delphi/Windows gilt Little-Endian, Du kannst deshalb die Bytes von CRC einzeln mit (CRC and $FF) und (CRC shr 8 and $FF) oder lo(CRC) und hi(CRC).

Gammatester


oOXTCOo - Mo 20.07.09 10:58

user profile iconGammatester hat folgendes geschrieben Zum zitierten Posting springen:
Das liegt daran, daß in den Daten die 16-Bit-Werte als einzelne Bytes dargestellt werden. Bei Ausgabe als Word sieht es so aus, als wenn die Bytes verdreht sind. Bei Delphi/Windows gilt Little-Endian, Du kannst deshalb die Bytes von CRC einzeln mit (CRC and $FF) und (CRC shr 8 and $FF) oder lo(CRC) und hi(CRC).

Gammatester


achso, dann ists klar.
ich habs jetzt einfach so gelöst das ich es als word ausgeben lasse und dann einfach vertausche und wieder als word ausgebe.

danke.