2013-05-09 100 views
0

我正在处理来自一个串行硬件的6字节消息。 在他们的手册中,制造商已经规定每个消息(第6个字节)的校验和是由'消息其余部分的总和的低字节'组成的。我的5字节数据校验和不是

Here is one of their examples, dissected

Here are some others

我还没有尝试过所有这些例子还没有,让我带的第一个“解剖”例如我的工作:

这是公式提供:

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

所以,总和是0x1B8,如果我把第一个8-b它,我得到0xB8 嗯...我做错了吗?

我想了一下,猜测,哦,也许他们只是做一个按位操作,而这在老的硬件上很常见? 所以我写了每一部分的比特和异或系列一起...

  • 0xB2^0×00 = 0xB2(杜)
  • 0xB2^0×69 =位于0xDB
  • 位于0xDB^0x1A的= 0xC1
  • 0xC1^0×83 = 的0x42

我的手这样做,并通过计算器。同样的结果。

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

查看求和的每个部分的二进制数,我不确定我能看到每个他们记录的输出的清晰模式。在一些校验和中,如IPv4头,进位被移位或加回到校验和中,这可能是这种情况吗?

我的问题是:

上午我在做这个校验和是如何被计算的数学错误?

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

回答

1

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

+0

是的,有一位同事也想出了这个。不幸的是,硬件也出现了错误,但一直保持不变。我只是假设规范中的某些内容发生了更改,并且文档已过时。 – WolverineOfLove 2013-05-09 23:12:23