【问题标题】:Calculating a checksum, using the most and least significant bits differently计算校验和,使用不同的最高和最低有效位
【发布时间】:2016-11-23 21:14:01
【问题描述】:

我正在尝试计算校验和,我不得不承认我的二进制操作知识失败了。

如果有人可以帮助解决以下问题(并改进此问题的标题),我将不胜感激。

(我已经尝试了很多东西,但我认为我只是没有正确地去做)

我之前问的一个问题在这里,但我认为技术不同 - 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

【问题讨论】:

  • 这一切看起来都像是简单的数学运算。您在哪个部分遇到了问题?
  • 我添加了一些我尝试过的东西(我也尝试了其他 3 种方法,使用位掩码切片等)我想我没有很好理解这句话 - 使用 OR 运算符将四个最低有效位变为“1”,形成 Checksum1,其中存储了 Checksum 的四个最高有效位。
  • 另外,我的总和是 582,在示例中,他们得到 0x46,即 70?

标签: python binary hex bit-manipulation checksum


【解决方案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,如校验和字节所示。

【讨论】:

  • 非常棒的帮助。我对这些东西相当生疏,你的回答完全有道理。很高兴看到您在这两种情况下如何使用面具。
猜你喜欢
  • 2020-09-07
  • 2011-05-25
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2017-06-01
  • 2021-03-10
  • 1970-01-01
相关资源
最近更新 更多