2017-11-29 2 views
0

Hier ist HEX-Zeichenfolge: 57 F1 0F 9A A8 B7 00 08 0B 19 10 00 00 00 00 00 11 0B 15 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00Prüfsumme für HEX-Zeichenfolge Python

A8 und B7 eine Prüfsumme ist, die i

In C es so berechnet berechnen müssen (100% gearbeitet):

void ByteStream_ComputeCS(void) 
{ 
     int i; 
     DWORD cs = 0; 
     for (i = 0; i < ByteStream[2] + 3; i++) 
     { 
       if (i != 2) cs += *((WORD*)ByteStream + i); 
     } 
     cs = (cs & 0xFFFF) + (cs >> 16); 
     ByteStream[4] = (BYTE)cs; 
     ByteStream[5] = (BYTE)(cs >> 8); 
} 

Im Versuch, es so zu tun:

data = bytearray.fromhex('57 F1 0F 9A 00 00 00 08 0B 19 10 00 00 00 00 00 11 0B 15 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00') 

c_sum = sum(data) 

I mit 0 nur Prüfsumme ersetzen - in C seine gerade nicht

if (i != 2) cs += *((WORD*)ByteStream + i); 

Aber ich 0x25e erhalten summieren. Und kann es nicht zu A8 und B7 bekommen. Was mache ich falsch?

+1

Sie machen verschiedene Dinge. Der C-Code ist eine Additions-Summe von Wörtern (vermutlich auch 16 Bit), wobei das Wort übersprungen wird, wo die Prüfsumme liegt, und ein Längenwert in den Daten verwendet wird. (Sieht ein bisschen wie eine IPv4-Prüfsumme aus.) Der Python-Code ist eine Summe von Bytes. Sie sollten in Struktur- oder Array-Module schauen. Außerdem haben Sie für uns nie definiert, was DWORD, WORD oder BYTE sind. Beispiel: 'hex (sum (array.array ('H', buffer (data)))) ' –

+0

Ich habe meinen Fehler und mein Problem gefunden: ich summe 57 + F1 + 0F + 9A + ... aber summiere 57F1 + 0F9A + .... Die Lösung fand ich ist hex-String in Bytes auf diese Weise zu konvertieren: def HexToByte (hexStr): Bytes = [] hexStr = '' .join (hexStr.split (“„)) für i im Bereich (0, len (hexStr), 4): bytes.append (int (hexStr [i: i + 4], 16)) return Bytes und sUM es dann. Aber gibt es einen anderen Weg? –

Antwort

0

So verstehe ich, dass ich habe 57F1 zu summieren + 0F9A + ...., aber mit

data = bytearray.fromhex(....) 
c_sum = sum(data) 

Ich mache es wie 57 + F1 + 0F + 9A + ..

Die Art und Weise um es zu lösen, fand ich:

def HexToByte(hexStr): 

    bytes = [] 

    hexStr = ''.join(hexStr.split(" ")) 

    for i in range(0, len(hexStr), 4): 
     bytes.append(int(hexStr[i:i + 4], 16)) 

    return bytes 

Und dann summieren Sie es. Und es ist ok Aber gibt es einen anderen Weg?

+0

Haben Sie 16-Bit-Bytes? Und hast du dir das Array angesehen? –