CRC算法python简单实现

import copy
import zlib


# https://github.com/Michaelangel007/crc32
def crc8():
    test_crc8 = 0x11   # 数据
    poly_crc8 = 0x11d  # 多项式
    for bit in range(8):
        if (test_crc8 & 0x80) != 0:   # 判断首位是否为1
            test_crc8 <<= 1           # 右移 
            test_crc8 ^= poly_crc8    # 异或计算
        else:
            test_crc8 <<= 1           # 不等于1则直接移位
    print(hex(test_crc8))


crc8()

def crc32():
    test_crc32 = 0x01
    test_crc32 <<= 24
    poly_crc32_1 = 0xedb88320
    poly_crc32_2 = 0x104c11db7
    for bit in range(8):
        if (test_crc32 & 0x80000000) != 0:  # 判断首位是否为1
            test_crc32 <<= 1                # 右移
            test_crc32 ^= poly_crc32_1      # 异或计算
        else:
            test_crc32 <<= 1                # 不等于1则直接移位
    print(hex(test_crc32))


def crc32_table_normal():   # 彩虹表算法,查表算法
    crc32_table_normal_list = []
    poly_crc32_normal = 0x104c11db7
    for byte in range(256):
        operator = copy.copy(byte)
        operator <<= 24
        for bit in range(8):
            if (operator & 0x80000000) != 0:
                operator <<= 1
                operator ^= poly_crc32_normal
            else:
                operator <<= 1
        crc32_table_normal_list.append(operator)
    to_print = list(map(hex, crc32_table_normal_list))
    print(to_print)


def crc32_table_recip():
    crc32_table_recip_list = []
    poly_crc32_recip = 0x104c11db7
    for byte in range(256):
        operator = copy.copy(byte)
        operator = int('{:08b}'.format(operator)[::-1], 2)   # 倒置
        operator <<= 24
        for bit in range(8):
            if (operator & 0x80000000) != 0:
                operator <<= 1
                operator ^= poly_crc32_recip
            else:
                operator <<= 1
        operator = int('{:032b}'.format(operator)[::-1], 2)  # 倒置
        crc32_table_recip_list.append(operator)
    to_print = list(map(hex, crc32_table_recip_list))
    print(to_print)

def crc32_recip(line):
    var = 0xffffffff
    for ch in line:
        operator = ord(ch)
        operator = (operator ^ var) & 0xff
        var = crc32_table_recip[operator] ^ (var >> 8)
    return var ^ 0xffffffff


# print(hex(zlib.crc32('123456789'.encode('utf-8'))))
# print(hex(crc32_recip('123456789')))


def crc32_normal(line):
    var = 0xffffffff
    for ch in line:
        operator = ord(ch)
        operator = int('{:08b}'.format(operator)[::-1], 2)
        var = crc32_table_normal[operator]^(var << 8)& 0xffffffff
    var = int('{:032b}'.format(operator)[::-1], 2)
    return var ^ 0xffffffff


# print(hex(crc32_normal('123456789')))


def crc32_table_polyrev():
    crc32_table_polyrev_list = []
    poly_rev = 0xedb88320
    for byte in range(256):
        operator = copy.copy(byte)
        for bit in range(8):
            if (operator & 0x1) != 0:
                operator >>= 1
                operator^=poly_rev
            else:
                operator >>= 1
        crc32_table_polyrev_list.append(operator)
    to_print_polyrev = list(map(hex, crc32_table_polyrev_list))
    print(to_print_polyrev)



# crc逆算法
def crc8_reverse():
    test_crc32_result = 0xd0
    poly_crc32 = 0x11d
    for bit in range(8):
        if test_crc32_result & 1 == 1:
            test_crc32_result ^= poly_crc32
            test_crc32_result <<= 1
            test_crc32_result |= 0x80
            continue
        else:
            test_crc32_result <<= 1
    print(hex(test_crc32_result & 0x08))


crc32_reverse()

 

### Python实现CRC校验算法的设计与代码示例 #### CRC校验算法简介 CRC(Cyclic Redundancy Check,循环冗余校验)是一种基于多项式的错误检测技术。它广泛应用于数据通信和存储领域,用于检测数据传输过程中的误码。在Python实现CRC校验算法可以通过模拟二进制除法完成。 以下是使用Python实现CRC校验的一个设计思路及其代码示例: --- #### 设计思路 1. **定义多项式**:选择适合的CRC多项式作为生成器。常见的有CRC-8、CRC-16、CRC-32等。 2. **初始化寄存器**:设置初始值(通常为全零或特定值如`0xFFFF`)。 3. **逐位处理数据**:将输入数据按位与当前寄存器值进行异或操作,并根据多项式执行移位运算。 4. **返回结果**:最终寄存器的值即为CRC校验值。 --- #### 代码示例 以下是一个完整的Python代码示例,实现CRC-16 CCITT标准的校验算法[^2]。 ```python def crc_ccitt(data, initial_value=0xFFFF, polynomial=0x1021): """ 计算CRC-16/CCITT校验值 参数: data (bytes): 输入的数据流 initial_value (int): 初始值,默认为0xFFFF polynomial (int): 多项式,默认为0x1021 返回: int: 计算得到的CRC-16校验值 """ crc = initial_value for byte in data: crc ^= (byte << 8) for _ in range(8): if crc & 0x8000: crc = (crc << 1) ^ polynomial else: crc <<= 1 crc &= 0xFFFF # 确保只保留16位 return crc # 测试用例 if __name__ == "__main__": test_data = b"123456789" result = crc_ccitt(test_data) print(f"CRC-16/CCITT of {test_data} is {hex(result)}") # 输出应为0x29B1 ``` --- #### 运行说明 上述代码中: - `data` 是待校验的字节序列。 - `initial_value` 和 `polynomial` 定义了具体的CRC变体参数。 - 对于测试字符串 `"123456789"`,其对应的CRC-16/CCITT校验值为 `0x29B1`。 --- #### 扩展功能 如果需要支持其他类型的CRC算法(如CRC-8、CRC-32),只需调整多项式和初始值即可。例如,对于CRC-32的标准实现,可参考如下代码片段[^4]: ```python import binascii def crc32(data): """ 使用内置模块计算CRC-32校验值 参数: data (bytes): 输入的数据流 返回: str: 十六进制形式的CRC-32校验值 """ return hex(binascii.crc32(data) & 0xFFFFFFFF) # 测试用例 if __name__ == "__main__": test_data = b"123456789" result = crc32(test_data) print(f"CRC-32 of {test_data} is {result}") # 输出应为0xcbf43926 ``` --- #### 总结 通过自定义逻辑或调用现有库函数,可以在Python中轻松实现各种CRC校验算法。以上代码展示了两种常见方式:手动实现CRC-16/CCITT以及利用`binascii`模块快速获取CRC-32值。 ---
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值