【问题标题】:My checksum of 5 bytes of data does not我的 5 个字节数据的校验和没有
【发布时间】:2013-05-04 13:24:02
【问题描述】:

我正在处理来自一个串行硬件的 6 字节消息。 在他们的手册中,制造商规定每条消息的校验和(其第 6 个字节)由“其余消息总和的低字节”组成。

Here is one of their examples, dissected

Here are some others

我还没有尝试所有这些示例,让我展示我在第一个“剖析”示例中的工作:

这是提供的公式:

Low byte of 0xB2 + 0x00 + 0x69 + 0x1A + 0x83 = 0x68

所以,总和是 0x1B8,如果我取前 8 位,我得到 0xB8 嗯……我做错了吗?

我想了想,猜到了,哦,也许他们只是做一个按位运算,这在旧硬件上很常见,对吧? 所以我把每个部分的部分都写出来了,然后把这个系列异或了……

  • 0xB2 ^ 0x00 = 0xB2(呵呵)
  • 0xB2 ^ 0x69 = 0xDB
  • 0xDB ^ 0x1A = 0xC1
  • 0xC1 ^ 0x83 = 0x42

我是用手和计算器完成的。结果一样。

我能够在我的程序中重现我的计算,我的校验和与硬件输出的完全不同。手动型号与我拥有的硬件相匹配...

查看总和每个部分的二进制文件,我不确定我能否看到每个记录输出的清晰模式。在某些校验和中,例如 IPv4 标头,进位被移位或添加回校验和,可能是这种情况吗?

我的问题是:

我是否在计算此校验和时出现数学错误?

任何帮助将不胜感激!谢谢。

【问题讨论】:

    标签: math hex byte bit-manipulation checksum


    【解决方案1】:

    我刚刚用 Windows RT 计算器攻击了所有样本,其他所有样本 (here) 都很好 - 只是 the first example (which you dissected) 是错误的。这看起来像是一个简单的文档拼写错误。

    【讨论】:

    • 是的,有一位同事也想出了这个。不幸的是,硬件也出现了错误,但是是一个常数。我只是假设规范中的某些内容已更改并且文档已过时。
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2018-11-05
    • 2021-11-29
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2012-08-27
    相关资源
    最近更新 更多