【问题标题】:Protocol Checksum [closed]协议校验和[关闭]
【发布时间】:2012-09-06 05:03:46
【问题描述】:

我有格式的onr协议

\003LLCCDDDD..DDXX
  • LL:不包括注意字节的总数据包长度。
  • CC:命令代码。
  • DD:数据字节(十六进制 ASCII)。
  • XX:LLCCDDDD..DD 的校验和(不包括注意字节和校验和本身)。校验和是命令包中 ASCII 字符的简单 8 位总和。

这是一个例子:

Command:    “\0030611C8”    (Length=6, command=0x11, checksum=0xC8)

我只想知道校验和是如何得出的 0xC8 谢谢 :)

【问题讨论】:

  • 协议从某些设备发送和接收命令
  • 在您的情况下,DATA 字节值是多少。现在长度不是 0x06。
  • @wbao - 它加起来对我来说是 6。 \003 注意字节,后跟 6 个字节 0611C8
  • @Carl Norum 0611C8 仅为 3 字节。
  • @rjayavrp - 不,不是。它是 6 个 ASCII 字节。那是一个 C 字符串,由 ASCII 编码的字节组成 - 不是 3 个本机十六进制字节的打字表示。它在 OP 的帖子中说:“DD:数据字节(以 HEX ASCII 格式)。”

标签: c protocols


【解决方案1】:

正如您对协议所述的描述,校验和是不是注意字节或校验和的字节的总和。您总共有 7 个字节的传输:

'\003', '0', '6', '1', '1', 'C', '8'

其中,\003 是注意字节,因此它不包含在校验和中。同样,最后两个字符校验和,不包括在内。您的示例只剩下 4 个字符:

'0', '6', '1', '1'

将这些字符转换为它们的十六进制表示(检查ASCII table)以使它们更容易添加,得到以下结果:

0x30, 0x36, 0x31, 0x31

然后将这些值相加得到:

0xC8

您正在寻找的答案是什么!

【讨论】:

  • 您能详细说明一下吗??
  • @james,你说的更详细是什么意思?你有什么问题?
  • 我的意思是 '0' 是如何转换成 0x30 的???
  • 您查看我链接的 ASCII 表了吗? ASCII '0' 是 0x30。仅此而已。
  • @james 这个答案很好 - 你自己也应该努力理解事物。所以不会喂你的。
【解决方案2】:

这是我的猜测:

你的校验和目标代码是 0611

让我们这样做:

ASCII(0) = 48, ASCII(6) = 54, ASCII(1) = 49;

得到 4 个 ASCII 的和是 200 = 0xC8

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 2013-04-29
    • 2020-02-28
    • 2011-11-12
    • 2013-01-02
    • 2014-09-09
    • 2017-09-24
    • 2012-09-29
    • 2019-01-18
    相关资源
    最近更新 更多