eks*_*akt 2 java delphi algorithm binary checksum
有人可以解释如何使用8位二进制加法计算校验和吗?这是文档的摘录:
这是消息的一般形式:
STX | TYPE | FS | DATA | FS | CHK | ETX
Run Code Online (Sandbox Code Playgroud)
STX是HEX 02
ETX是HEX 03
FS是HEX 15
"类型"是唯一的1字节消息标识符(例如,用于轮询消息的"P")."数据"包含可打印的ASCII字符.
校验
校验和是根据所有字符计算的,包括和<FS>
之间的所有字符.校验和通过所有包含字符的8位二进制加法计算,其中第8个或奇偶校验位假定为零.超过第8位的数据丢失了.8位结果转换为两个可打印的ASCII十六进制字符,范围从00到FF,然后插入到数据流中.十六进制字符AF是大写的.接收设备重新计算缓冲消息的校验和,并将其与收到的校验和进行比较.比较是后续确认()或传输的否定确认()的基础.<STX>
<CHK>
<CHK>
<ACK>
<NAK>
将每个字符视为整数值.由于假设每个字符的高位为零(如规范中没有说你需要检查它),用这样的东西掩盖它的值(伪C/C++/Java /无论如何):
get_next_character() & 0x7f;
Run Code Online (Sandbox Code Playgroud)
现在你只需要添加(伪C/C++/Java /无论如何):
int s = 0;
while(!end_of_string())
{
s += get_next_character() & 0x7f;
s &= 0xff;
}
Run Code Online (Sandbox Code Playgroud)
这将连续添加每个ASCII字符,并从结果总和中删除第8位之后的所有内容.当你全部完成时(C或写得不好的C++):
printf("Checksum: %02x\n", s); /* You may need %02X for uppercase.
I don't remember my printf codes anymore. */
Run Code Online (Sandbox Code Playgroud)
作为优化(如果你真的需要它 - 在这种情况下不太可能!)你可以推迟该s &= 0xff
位,而是在使用点处使用截断作为校验和.但是这不会对性能有很大帮助 - 但是你的I/O将会更加昂贵 - 并且当你重构代码时,可能会在以后忘记这样做.