如何在接收到的比特流上应用CRC16?(Python)

2024-09-29 06:22:12 发布

您现在位置:Python中文网/ 问答频道 /正文

这里有人能帮我理解一下,我是如何在收到的字符串上应用CRC16的吗?你知道吗

stream = [0, 1, 1, 0, 0, 0, 0, 1, 0, 1, 0, 0, 0, 1, 0, 1, 0, 0, 0, 0, 0, 0, 1, 0, 0, 0, 0, 0, 0, 0, 1, 0, 0, 0, 0, 0, 0, 0, 1, 0, 0, 0, 0, 0, 0, 0, 1, 0, 0, 0, 0, 0, 0, 1, 1, 0, 0, 0, 1, 0, 0, 1, 0, 1, 0, 1, 0, 0, 0, 0, 0, 1, 0, 1, 1, 0, 0, 1, 1, 0, 0, 1, 1, 1, 0, 0, 0, 1, 0, 1, 1, 1, 0, 0, 0, 1, 0, 1, 1, 1, 0, 1, 0, 1, 0, 0, 1, 0, 0, 1, 1, 0, 0, 0, 1, 0, 0, 1, 0, 1, 0, 1, 1, 0, 0, 1, 0, 1, 0, 0, 0, 0, 0, 1, 1, 0, 0, 1, 0, 0, 1, 0, 0, 1, 0, 1, 1, 0, 0, 1, 0, 1, 0, 1, 1, 0, 0, 1, 0, 1, 1, 0, 0, 0, 0, 1, 1, 1, 1, 1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1, 1, 1, 1, 1, 0, 1, 1, 1, 1, 0, 0, 1, 0, 1, 0, 1, 1, 0, 0, 0, 1, 0, 0, 1, 1, 0, 0, 0, 0, 1, 0, 1, 1, 0, 0, 1, 0, 0, 0, 1, 1, 0, 0, 0, 1, 1, 1, 0, 1, 0, 0, 1, 0, 0, 0, 1, 1, 0, 0, 1, 0, 1, 0, 1, 1, 0, 0, 0, 1, 1, 1, 0, 0, 1, 0, 1, 1, 1, 1, 0, 1, 0, 0, 0, 0, 0, 0, 1, 1, 0, 0, 1, 1, 0, 0, 1, 1, 0, 0, 1, 0, 0, 1, 1, 1, 0, 0, 0, 0, 1, 0, 1, 1, 0, 0, 1, 1, 1, 0, 1, 1, 0, 0, 0, 1, 1, 1, 0, 1, 0, 0, 1, 1, 0, 0, 1, 1, 0, 0, 0, 0, 0, 0, 1, 1, 0, 0, 1, 0, 1, 0, 0, 0, 1, 0, 1, 0, 1, 1, 0, 1, 0, 0, 0, 0, 0, 0, 0, 1, 0, 0, 1, 0, 1, 0, 0, 1, 1, 0, 1, 0, 0, 0, 1, 1, 1, 0, 1, 1, 0, 0, 1, 1, 1, 0, 0, 0, 1, 1, 0, 1, 1, 0, 0, 1, 1, 1, 0, 1, 0, 0, 1, 1, 0, 0, 0, 1, 1, 0, 1, 1, 0, 0, 0, 1, 1, 0, 0, 0, 0, 0, 0, 1, 0, 0, 1, 0, 0, 0, 0, 0, 1, 0, 1, 1, 1, 0, 0, 0, 1, 0]


rest = [1, 1, 1, 1, 1, 1, 0, 0, 0, 0, 1, 1, 0, 1, 1, 1]

https://pastebin.com/7CMtSEE6

我收到了APRS的消息。我也直接用mutlimon解码了它,得到了与我自己的PYTHON代码相同的ascii消息。 在stream变量中是删除位填充之后和反转每个字节的位序列之前收到的消息。你知道吗

到目前为止,我尝试的是在它上面应用x^16+x^12+x^5+1,但没有成功。我想得到和你在垃圾箱里看到的一样的“休息”。其余部分也在流中,但是为了更好的可读性,我把它放到了另一个变量中。剩下的部分只是复制出来的,所以顺序是一样的。你知道吗

那么,在我的思路中,哪里我错了?
坦白地说,我想请你一步一步地告诉我,因为我需要“看看”它是如何工作的,以便更好地理解它。那对我真的很有帮助。你知道吗

所以首先要开始: stream = [0, 1, 1, 0, 0, 0, 0, 1, 0, 1, 0, 0, 0, 1, 0, 1, 0, 0, 0, 0, 0, 0, 1,。。。你知道吗

现在,我将按照0x11021的相反方向划分流

0,1,1,0,0,0,0,1,0,1,0,0,0,1,0,1,0,0,0,0,0,0,1,...
  1,0,0,0,0,1,0,0,0,0,0,0,1,0,0,0,1

0,0,1,0,0,0,1,1,0,1,0,0,0,0,0,1,0,1

这是正确的开始吗?或者我必须先反转流中的每一组字节吗?你知道吗

先谢谢你

安德烈亚斯

这个问题与这个有关,但具体来说是围绕crc16。。。 How to decode Bell 202 signal? (APRS data from International Space Station)


Tags: 字符串代码httpscomrest消息stream字节
1条回答
网友
1楼 · 发布于 2024-09-29 06:22:12

Greg Cook's catalog中有十一个CRC-16使用这个多项式,可能还有更多的不在他的目录中。所以当你说“CRC-16”时,可能会有很多不同的东西。你知道吗

二进制数据可以用两种不同的方式解释为字节,一种是最高有效位优先,另一种是最低有效位优先。如果是前者,那么“rest”中的CRC就是CRC-16/GENIBUS。如果是后者,则是X-25 CRC-16。你知道吗

在这两种情况下,CRC寄存器都用所有的1(0xffff)初始化,并在最后反转,即用0xffff进行异或运算。在复制CRC的尝试中,您可能缺少初始化和后处理。你知道吗

下面是一些简单的X-25 CRC-16 C代码,它将在假设最低有效位优先的情况下对数据进行操作:

unsigned crc16x25(unsigned char *data, size_t len) {
    unsigned crc = 0xffff;
    while (len ) {
        crc ^= *data++;
        for (unsigned k = 0; k < 8; k++)
            crc = crc & 1 ? (crc >> 1) ^ 0x8408 : crc >> 1;
    }
    crc ^= 0xffff;
    return crc;
}

所以如果你喂它0x86 0xa2。。。0x47,您将得到0xec3f作为CRC。你知道吗

相关问题 更多 >