我正在建设和UDP服务器与GPS设备通信。它是内置在节点使用数据报。
我有这个数据来计算它的校验和:>RGP261222120013-3520041-05908923000176700DF4400;ID=4718;#44E6;*24<
GPS设备手册是这样说的:* 校验和:十六进制格式,它是通过XOR所有字符的ASCII码组成的消息开始的〉和结束在最后;(包括),但不包括最后一个星号 *
因此,用于计算校验和的字符串为>RGP261222120013-3520041-05908923000176700DF4400;ID=4718;#44E6;
设备手册给出了一个C#示例,我尝试将其改编为JavaScript:
C#示例
public static string calculateChecksum(string data)
{
int r;
int calc = 0;
byte caracter;
string calculated_checksum;
for (r = 0; r < data.Length; r++) {
if ((data[r] == '*') && (data[r-1] == ';')) break;
caracter = (byte)data[r];
calc = calc ^ (byte)caracter;
}
calculated_checksum = calc.ToString("X");
return calculated_checksum;
}
我的JS适应到目前为止
export const calculateChecksum = (packet) => {
const len = packet.length;
const position = packet.indexOf(';*') + 1;
const packetToCheck = packet.slice(0, position);
let checksum = 0;
for (let char of packetToCheck) {
checksum ^= char.charCodeAt(0);
};
return checksum.toString(16);
}
从其他软件中,我得到的对该数据的响应是:>ACK;ID=4718;#44E6;*26<
计算出的校验和为26(这是正确的结果)。如果服务器发送的校验和错误,设备将重复该消息。
用我的方法,我得到的结果是24。
我真的不知道该怎么向前看。
1条答案
按热度按时间tkclm6bt1#
我误解了文档。我没有删除问题,所以每个人都可以访问该函数。