1. ホーム
  2. python

[解決済み] Pythonで16進文字列の全バイトのxorチェックサムを作成する

2022-02-17 08:51:42

質問

BSS London Blu-80という音声処理装置と通信しようとしたところ、メッセージをXoringして作成したチェックサムを送信しなければならないことがわかりました。 送信されるメッセージの例は次のとおりです。

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

0xc2がそのメッセージの正しいチェックサムである。

チェックサムは、メッセージ本文の全バイトを1バイトの排他的論理和(xor)にしたものです。

メッセージの本文は、上記のものからチェックサムを除いたものです。

しかし、私が試したコード。

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'

私は明らかにここで何か間違ったことをしており、これを完全に理解していません。 何かお手伝いいただけると大変助かります。

ありがとうございます。

解決方法は?

を宣言しています。 packet 印刷可能な表現 のメッセージになります。

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

ということは、現在のメッセージは [0x8d, 0x1e, ..., 0x00] でなく ['0', 'x', '8', 'd', ..., '0'] の代わりに だから、まずはそれを修正することです。

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(' ')]

あるいは、最初から "right"エンコードを検討することもできます。

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

この時点で、メンバーごとにxorすることができます。

checksum = 0
for el in packet:
    checksum ^= ord(el)

print checksum, hex(checksum), chr(checksum)

チェックサムは 0x59 ではなく 0xc2 ということは、間違った計算をしたか、元のメッセージがあなたが提供したものでないかのどちらかです。