计算校验和,使用不同的最高有效位和最低有效位
Calculating a checksum, using the most and least significant bits differently
我正在尝试计算校验和,我不得不承认我的二进制操作知识让我失望了。
如果有人可以帮助解决以下问题(并改进这个问题的标题),我将不胜感激。
(我已经尝试了很多东西,但我认为我只是没有正确地去做)
我之前问的一个问题在这里,但是技术不同,我想 -
以下文档:
为了避免校验和与任何控制字节(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
The result is obtained as an unsigned char.
这意味着您必须只使用 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,如校验和字节所示。
我正在尝试计算校验和,我不得不承认我的二进制操作知识让我失望了。
如果有人可以帮助解决以下问题(并改进这个问题的标题),我将不胜感激。
(我已经尝试了很多东西,但我认为我只是没有正确地去做)
我之前问的一个问题在这里,但是技术不同,我想 -
以下文档:
为了避免校验和与任何控制字节(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
The result is obtained as an unsigned char.
这意味着您必须只使用 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,如校验和字节所示。