Python实现Iridium SBD校验和计算错误排查求助
解决Iridium SBD校验和计算错误问题
你的核心问题在于当前代码返回的是校验和的十进制数值,而非Iridium要求的高位字节在前的2字节十六进制格式,导致不足2字节时高位字节丢失,不符合协议要求。
问题分析
根据你提供的例子:ASCII"hello"的十六进制字节是68 65 6c 6c 6f,求和结果为532(十六进制0x214),Iridium要求的校验和是高位先发送的2字节02 14,对应十六进制字符串0214。而你的代码返回的是十进制数值532,若直接转换为十六进制会得到214,缺少前导的高位字节02,这就是错误根源。
对于内容123(十六进制7b),求和结果为123(十六进制0x007b),正确的校验和应该是00 7b,对应十六进制字符串007b,但你的代码返回的十进制123转十六进制会丢失高位的00。
修正后的代码
将计算得到的16位校验和数值,格式化为高位在前的4位十六进制字符串(自动补前导零),代码如下:
import logging def calculate_checksum(hex_string): # 输入为十六进制格式的字符串 total_sum = 0 if hex_string: # 按每两个字符分割为字节,转换为整数列表 byte_list = [int(hex_string[i:i+2], 16) for i in range(0, len(hex_string), 2)] total_sum = sum(byte_list) # 保留最低2字节(16位) checksum_value = total_sum & 0xFFFF # 格式化为高位在前的4位十六进制字符串 checksum_hex = f"{checksum_value:04x}" logging.debug(f'Calculated Checksum: {checksum_hex}') return checksum_hex
验证
- 输入
"68656c6c6f"(hello的十六进制),返回"0214",与例子中的校验和完全匹配。 - 输入
"7b"(内容123的十六进制),返回"007b",符合Iridium高位先发送的要求。
如果你的SBD消息包含协议头字段,需要将这些字段的十六进制也纳入hex_string参数中,因为校验和是整个SBD消息的字节求和,而非仅payload部分。
内容的提问来源于stack exchange,提问作者Natascha Fritschle
相关产品推荐
相关产品推荐

