python中铱星SBD的2字节校验和

python中铱星SBD的2字节校验和,python,python-3.x,checksum,iridium,Python,Python 3.x,Checksum,Iridium,我需要计算从铱星模块(短突发数据)接收的消息校验和的最低有效2字节(以字节为单位) 我正在使用的代码在大多数情况下都有效,但在下面的示例中并不有效 我的代码是: z=b"AT+SBDRB\r\x00\x18this is a random message\x08\xdb"#message received from Iridium module msg=z[11:-2] print(msg) checksum_received = z[-2:] checksum = 0 check_it = F

我需要计算从铱星模块(短突发数据)接收的消息校验和的最低有效2字节(以字节为单位)

我正在使用的代码在大多数情况下都有效,但在下面的示例中并不有效

我的代码是:

z=b"AT+SBDRB\r\x00\x18this is a random message\x08\xdb"#message received from Iridium module
msg=z[11:-2]
print(msg)
checksum_received = z[-2:]
checksum = 0
check_it = False

for c in msg:
    checksum = checksum + c #msg is a byte type

a=chr( checksum >> 8 ) 
b=chr( checksum & 0xFF )
c=a.encode()
d=b.encode()
checksum = c + d

print(c.hex())
print(d.hex())
print(checksum.hex())
print(checksum_received.hex())
print(checksum == checksum_received)
在上述情况下,校验和与我收到的校验和不同(我多次尝试发送消息,以确保没有收到传输错误)

我用以下消息测试了代码,两个校验和是相同的:

z=b"AT+SBDRB\r\x00\x05hello\x02\x14"
z=b"AT+SBDRB\r\x00\x14thisisarandommessage\x08["
z=b"AT+SBDRB\r\x00\x15this isarandommessage\x08{"
铱星SBDS手册中给出的唯一信息是:

校验和是数据总和的最低有效2字节 整个SBD消息。必须首先发送高阶字节。例如 如果FA向智能开关单元发送ASCII编码的“hello”一词,则为二进制
流将是十六进制68 65 6c 6c 6f 02 14。

您似乎正在将计算的校验和转换为两个独立的
chr()
值,然后对它们进行编码

更简单的是:

z=b"AT+SBDRB\r\x00\x18this is a random message\x08\xdb"#message received from Iridium module
msg=z[11:-2]
print(msg)
checksum_received = z[-2:]

# checksum = 0
# for c in msg:
#     checksum = checksum + c #msg is a byte type
checksum = sum(msg)

# checksum is the correct value here
print(hex(checksum))
a = checksum >> 8 
b = checksum & 0xFF

# Now convert checksum back into a bytes object just like z[-2:] above
checksum = bytes([a,b])
print(checksum.hex())
print(checksum_received.hex())

# now these two are the same
print(checksum == checksum_received)

我研究了Virtenio在其上使用的代码,似乎quamrana是正确的。我可以提供以下Java函数来计算校验和。Java,因为Virtenio具有用于嵌入式系统的PreonVM,可以用Java编程。代码如下:

int calcChecksum(byte[] data, int length) {
    int checkSum = 0;
    for (int i = 0; i < length; i++) {
        checkSum += data[i] & 0xFF;
    }
    return checkSum & 0xFFFF;
}
int-calcChecksum(字节[]数据,int-length){
整数校验和=0;
for(int i=0;i
然后,您必须将计算出的校验和与接收到的校验和进行比较,如果它们匹配,则接收到的数据是有效的。校验和只需将数据的所有字节相加即可计算出来。校验和有两个字节长,因此您只需要校验和中较低的两个字节