【问题标题】:How is the Checksum from Hex file calculated?如何计算来自 Hex 文件的校验和?
【发布时间】:2016-01-03 23:36:32
【问题描述】:

正如标题所说,我很想知道校验和值是如何计算的,从我读过的内容来看,它是使用 2s 补码计算的。下面是加载到我的微控制器上的 hex 文件中的 2 行,我添加了空格以使其更易于阅读,S315 出现在每一行,第 1 行的地址是 080C0000 后跟 16 个十六进制值,代表字节,第 1 行的值 AA 和第 2 行的 AB 是我假设的校验和值。

对于第 1 行,我尝试添加以下 15+08+0C+00+00+4D+53+53+70+6F+74+31+00+66+10+AE+19+7E+63+1F+78,这给了我 555 Hex 或 ‭010101010101‬ 二进制。我已将二进制值输入在线 2s 补码计算器,但它总是显示“无效二进制”??

S3 15 080C0000 4D 53 53 70 6F 74 31 00 66 10 AE 19 7E 63 1F 78 AA

S3 15 080C0010 00 00 00 00 45 85 63 EB FF FF FF FF 04 00 03 00 AB

【问题讨论】:

  • 什么样的文件?从你在哪里读到的?校验和还是 CRC?注意这个词是双complement,而不是'compliment'。
  • 注 0x55 + 0xaa 加起来等于 0xff。只是说...
  • @EJP - 这是一个 .hex 文件
  • 什么是 .hex 文件?它在哪里指定?
  • 它并不特定于单个微控制器。他说的是英特尔 HEX 格式,这是许多供应商多年来(可能是几十年)使用的标准。

标签: binary hex


【解决方案1】:

您添加字节值,就像您所做的那样。从那个总和中,您只取最低有效字节。

然后对于摩托罗拉 HEX (SREC): 然后你通过反转它的位来取那个字节的补码(即1s变成0s,反之亦然)。

然后对于英特尔 HEX: 然后你通过反转它的位来取那个字节的二进制补码(即1s变成0s,反之亦然),然后你加1。

按照您的示例,总和为 0x555。然后取最低有效字节,即 0x55。

对于 Motorola HEX (SREC):计算它的反码。你得到 0xAA 作为校验和。

对于英特尔 HEX:计算它的二进制补码。你得到 0xAB 作为校验和。

【讨论】:

  • 好吧,0x55​​ 是 0xAA 倒置的吗?我不需要从中减去 1
  • 也许我有点不清楚 - 如果你取 0x55 的二进制补码,你会得到 0xAB。然后你需要减去 1 得到 0xAA。
  • 0x55 是 01010101,反转位是 10101010 还是 0xAA??
  • 保持简单。 X 的补码是 -X。
  • @DavidMcQillan 是的,你是对的。但是如果你只是反转位,你会得到一个的补码。要获得两者的补码,您还需要添加一个。
猜你喜欢
  • 2017-12-08
  • 2012-05-18
  • 2020-09-28
  • 2017-04-21
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多