【发布时间】:2014-07-08 19:51:15
【问题描述】:
我需要校验和计算方面的帮助。 这是(不是我的代码!)但来自规范 http://www.leupamed.at/?wpdmact=process&did=NC5ob3RsaW5r
private void CalcCheckSum(string msg, out byte checksum1, out byte checksum2)
{
byte cs1 = 0;
byte cs2 = 0;
// Always use "\n" as line break when calculating the checksum.
msg = msg.Replace("\r\n", "\n"); // Find and replace CR LF with LF
msg = msg.Replace("\r", "\n"); // Find and replace CR with LF.
for (int i = 0; i < msg.Length; i++)
{
cs1 += (byte) msg[i];
cs2 += cs1;
}
checksum1 = cs1;
checksum2 = cs2;
}
我必须像这样创建一个数据包:
<!--:Begin:Chksum:1:--><!--:Ack:Msg:3:0:--><!--:End:Chksum:1:184:62:-->
字符串<!--:Ack:Msg:3:0:--> 是实际数据,我必须计算两个校验和字节(184 和 62)并将它们插入到最终数据包中(如上所示)。
但我的计算结果是 10 和 62
var msg = "<!--:Ack:Msg:3:0:-->";
byte checksum1 = 0;
byte checksum2 = 0;
CalcCheckSum(msg, out checksum1, out checksum2);
我现在不知道如何计算正确的校验和值。 这是响应的校验和。不用于验证请求。 由于声誉低,我无法上传图片,因此请查看规范中的最后一行:https://drive.google.com/file/d/0B_Gs9q9SJteadVRwSVc1a2FmUTg/edit?usp=sharing 该确认消息独立于请求。只有它必须是对请求消息 ID 3 的响应。
解决方案?
计算校验和后:
校验和1 = 256 - (10 + 62) = 184
校验和2 = 62
设备通信没有问题,现在。
【问题讨论】:
-
也许您应该解释一下该语法,并告诉我们确切的问题是什么。示例输入和输出会有很大帮助。
-
CalcCheckSum 是必须以 2 个字节计算字符串的函数。 是一个计算字符串,但我不能将输出字节(cs1 = 184,cs2 = 62)作为文档中的示例。
-
我还是不明白。
-
在上面的例子中,
msg的期望值和结果checksum1和checksum2值是多少? -
根据 BM800 的文档,您不会生成传输校验和的值,而是生成值以验证校验和。因此,您的值 10 和 62 是正确的。根据文档,您必须申请
checksum1 += transferredChecksum1; checksum2 += checksum1; checksum1 += transferredChecksum2; checksum2 += checksum1;来验证校验和。其中checksum1为10,checksum2为62,transferChecksum1为184,transferChecksum2为62。如果计算后checksum1和checksum2等于0,则校验和有效。