擅长:python、mysql、java
<p>您已将<code>packet</code>声明为消息的可打印表示:</p>
<pre><code>packet = '0x8d 0x1e 0x19 0x1b 0x83 0x00 0x01 0x01 0x00 0x00 0x00 0x4b 0x00 0x00'
</code></pre>
<p>所以您当前的消息不是<code>[0x8d, 0x1e, ..., 0x00]</code>,而是<code>['0', 'x', '8', 'd', ..., '0']</code>。所以,第一步是修复它:</p>
<pre><code>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(' ')]
</code></pre>
<p>或者,您可以考虑从一开始就对其进行“正确”编码:</p>
<pre><code>packet = '\x8d\x1e\x19\x1b\x83\x00\x01\x01\x00\x00\x00\x4b\x00\x00'
</code></pre>
<p>此时,我们可以逐个成员执行xor:</p>
<pre><code>checksum = 0
for el in packet:
checksum ^= ord(el)
print checksum, hex(checksum), chr(checksum)
</code></pre>
<p>我得到的校验和是<code>0x59</code>,而不是<code>0xc2</code>,这意味着要么您计算错了,要么原始消息不是您提供的消息。</p>