python - 如何在 Python 中对原始二进制数据使用按位运算符进行 CRC 检查?

标签 python bit-manipulation crc

这是我第一次在 Python 中使用二进制运算符和原始二进制数据,并且我正在努力编写文档中定义的 CRC 检查代码。

文档在如下伪代码中定义了 CRC 校验:

GENERATOR = 1111111111111010000001001

MSG = binary("8D4840D6202CC371C32CE0576098")  # total 112 bits

FOR i FROM 0 TO 88:                           # 112 - 24 parity bits
  if MSG[i] is 1:
    MSG[i:i+24] = MSG[i:i+24] ^ GENERATOR

CRC = MSG[-24:]                               # last 24 bits

IF CRC not 0:
  MSG is corrupted

到目前为止,我已经编写了以下代码:

adsb_hex = "8D4840D6202CC371C32CE0576098"
adsb_dec = int(adsb_hex, 16)
adsb_bin = bin(adsb_dec)[2:].zfill(8)

generator = 0b1111111111111010000001001

adsb_bin_list = [int((adsb_dec >> bit) & 1) for bit in range(112 - 1, -1, -1)]

check = []
for i in range(88):
    curr_bit = adsb_bin_list[i]
    if curr_bit is 1:
        check[i:i+24] = int(adsb_bin_list[i:i+24]) ^ generator

crc = check[-24:]

我不知道正确的 Pythonic 方法:

MSG[i:i+24] = MSG[i:i+24] ^ GENERATOR

CRC = MSG[-24:]

我怎样才能以 Pythonic 的方式正确地做到这一点?

最佳答案

如果您可以使用库,我建议您搜索您最喜欢的位串/位向量库。例如,使用 BitVector==3.4.8你可以写

from BitVector import BitVector

generator = BitVector(bitstring='1111111111111010000001001')
crc_length = len(generator) - 1

def compute_crc(message : BitVector) -> BitVector:
    content_length = len(message) - crc_length
    # to encode a message, you pad it with 0
    # to decode, you pass in the message with the crc appended
    assert content_length >= 0
    # operate on a copy of the data
    message = message.deep_copy()
    for i in range(content_length):
        if message[i]:
            message[i:i + len(generator)] ^= generator
    return message[-crc_length:]

if __name__ == "__main__":
    adsb_hex = "8D4840D6202CC371C32CE0576098"
    adsb_crc = compute_crc(BitVector(hexstring = adsb_hex))

关于python - 如何在 Python 中对原始二进制数据使用按位运算符进行 CRC 检查?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/51503075/

相关文章:

python - 为 Pandas 数据框中的每个现有变量从行创建新变量

python - 从不同的文件运行单元测试

sql - 我可以将一堆 boolean 列转换为 PostgreSQL 中的单个位图吗?

java - 使用 toHexString 解析 Long 时如何删除前导 "f"

javascript - 使用 BeautifulSoup 解析 Soundcloud 源

python - 如何在 Tkinter TkTable 中插入/设置数据

c++ - 检查是否至少设置了一点而不跳转

checksum - 关于CRC基础的几个问题

python - 用Python重写的C CRC计算方法好像不对

c# - 基本的 CRC32 维基百科实现与在线看到的标准 CRC32 不同