计算校验和,使用最高和最低有效位不同

时间:2016-11-23 21:14:02

标签: python binary hex bit-manipulation checksum

我试图计算校验和,我不得不承认我的二元操作知识让我失望。

如果有人可以提供以下帮助(并改善这个问题的标题),我将非常感激。

(我已经尝试了很多东西,但我认为我还没有正确地做到这一点)

我问的上一个问题就在这里,但我认为技术不同 - How to build byte array frame and calculate checksum

以下文档:

为了避免校验和与任何控制字节(0x02和0x03)一致,校验和被分成两个字节。在第一个字节中引入了四个最低有效位,在第二个中引入了四个最重要的位。

示例:

以下命令的校验和计算:

STX 0x02
Filler1 0x30
Filler2 0x30
Address 0x81
Type 0x56 “V”
Tray 0x8B
Belt 0x82
Checksum1 0xF6
Checksum2 0x4F
ETX 0x03

添加校验和之前的每个字节的值。结果以unsigned char获得。

Checksum = 0x02+0x30+0x30+0x81+0x56+0x8B+0x82 = 0x46

使用OR运算符将四个最高有效位设置为“1”,形成Checksum1,其中存储Checksum的四个最低有效位。

Checksum1 = Checksum | 0xF0 = 0x46 | 0xF0 = 0xF6

使用OR运算符将四个最低有效位更改为“1”,形成Checksum1,其中存储了校验和的四个最高有效位。

Checksum2 = Checksum | 0x0F = 0x46 | 0x0F = 0x4F

其他

def print_bytes(bytes):
    print("\n" + " ".join("\\x%02X" % v for v in bytes))

frame = bytearray([0x02,0x30,0x30,0x81,0x56,0x8B,0x82])

print_bytes(sum(frame).to_bytes(2, "little"))

\x46 \x02

1 个答案:

答案 0 :(得分:1)

  

结果以无符号字符的形式获得。

这意味着您只能使用8个最低有效位进行计算。

>>> (0x02 + 0x30 + 0x30 + 0x81 + 0x56 + 0x8b + 0x82)
582
>>> (0x02 + 0x30 + 0x30 + 0x81 + 0x56 + 0x8b + 0x82) & 0xff
70

然后在这8位中,您需要设置4个最高和最低有效位。

>>> 70 | 0xf0
246
>>> 70 | 0x0f
79

然后产生0xf6和0x4f,如校验和字节所示。