You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

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

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.07.02 23:47:07