2014-10-22 16 views
5

Durante il tentativo di comunicare con un dispositivo di elaborazione audio denominato BSS London Blu-80, ho scoperto che devo inviare un checksum creato da Xoring il messaggio. Un messaggio di esempio inviato è:Creazione di xum checksum di tutti i byte in stringa esadecimale In Python

0x8d 0x1e 0x19 0x1b 0x83 0x00 0x01 0x01 0x00 0x00 0x00 0x4b 0x00 0x00 0xc2 

Con 0xc2 il checksum corretto per tale messaggio.

"Il checksum è un esclusivo a byte singolo o (xor) di tutti i byte nel corpo del messaggio."

Il corpo del messaggio è quello precedente meno il checksum.

Il codice tento comunque:

packet = '0x8d 0x1e 0x19 0x1b 0x83 0x00 0x01 0x01 0x00 0x00 0x00 0x4b 0x00 0x00' 
xor = 0 
i = 0 
while i < len(packet): 
    xor = xor^ord(packet[i]) 
    i += 1 

>>print xor 
46 
>>print hex(xor) 
'0x2e' 

Sono ovviamente facendo qualcosa di sbagliato qui, e non del tutto la comprensione di questo. Qualsiasi aiuto sarà molto apprezzato.

Grazie!

+1

Provare 'packet = '\ x8d \ x1 \ x19 \ x1b \ x83 \ x00 \ x01 \ x01 \ x00 \ x00 \ x00 \ x4b \ x00 \ x00''. –

+0

Qui puoi vedere il tuo risultato: th-thielemann.de/tools/checksum.html –

risposta

5

Hai dichiarato packet come rappresentazione stampabile del messaggio:

packet = '0x8d 0x1e 0x19 0x1b 0x83 0x00 0x01 0x01 0x00 0x00 0x00 0x4b 0x00 0x00' 

in modo che il messaggio corrente non è [0x8d, 0x1e, ..., 0x00], ma ['0', 'x', '8', 'd', ..., '0'] invece. Quindi, primo passo è fissandolo:

packet = '0x8d 0x1e 0x19 0x1b 0x83 0x00 0x01 0x01 0x00 0x00 0x00 0x4b 0x00 0x00' 
packet = [chr(int(x, 16)) for x in packet.split(' ')] 

Oppure, si potrebbe prendere in considerazione la codifica "giusto" fin dall'inizio:

packet = '\x8d\x1e\x19\x1b\x83\x00\x01\x01\x00\x00\x00\x4b\x00\x00' 

A questo punto, siamo in grado di XOR, membro per membro:

il checksum che ottengo è 0x59, non 0xc2, il che significa che o avete calcolato quello sbagliato o il messaggio originale non è quello che avete fornito.

+0

Beh, questo aggiunge un po 'di confusione. Quel messaggio con somma di controllo è stato generato dallo strumento utilizzato per testare i comandi su diversi oggetti all'interno del blu-10. Quando copio quel messaggio e lo mando direttamente con Python, lo stato dell'oggetto cambia. Quindi il checksum è corretto per quella stringa. – Nicholas

+0

La documentazione a cui si riferisce _ " è l'OR esclusivo di tutti i byte in , ** prima della sostituzione **." _. Non so che cosa significhi "sostituzione", ma suppongo che il problema risieda in ciò che viene sostituito. –

+0

Hai ragione. Per tutto il tempo pensavo che non stavo sostituendo. Tuttavia, non ho mai pensato che la stringa generata dallo strumento DI mi stesse mostrando una stringa con le sostituzioni .. Dopo aver rimosso '\ x1b \ x83' e sostituito con quello che sostituisce (\ x03), quindi generando il checksum, sono stato in grado per restituire c2. Grazie per averlo portato alla mia attenzione! – Nicholas