通用 CRC(循环冗余校验)实现

5 篇文章 0 订阅
3 篇文章 0 订阅

CRC(循环冗余校验)

  • 支持 CRC8、CRC16、CRC24、CRC32、CRC64
  • 支持单次计算、分次计算
  • 支持自定义参数模型
  • 支持代码生成(C/C++)

仓库地址

  1. python: skb666/CRC
  2. c/c++: skb666/libcrc

使用方法

已知参数模型

from crc import CRC

# 实例化一个 CRC,参数模型使用 crc32_mpeg2
crc32_mpeg2 = CRC("crc32_mpeg2")

data1 = b'hello '
data2 = b'world'
data3 = b'!!!'

# 单次校验
crc1 = crc32_mpeg2(data1 + data2 + data3)

# 分次校验
crc32_mpeg2.reset()
val1 = crc32_mpeg2.accumulate(data1)
val2 = crc32_mpeg2.accumulate(data2)
val3 = crc32_mpeg2.accumulate(data3)
crc2 = crc32_mpeg2.get()

print(hex(crc1), hex(crc2))

自定义参数模型

from crc_calc import CRC_CALC

data1 = b'hello '
data2 = b'world'
data3 = b'!!!'

crc32 = CRC_CALC(32, 0x04c11db7, 0xffffffff, 0xffffffff, True, True)

# 单次校验
crc1 = mycrc(data1 + data2 + data3)

# 分次校验
crc32_mpeg2.reset()
val1 = crc32.accumulate(data1)
val2 = crc32.accumulate(data2)
val3 = crc32.accumulate(data3)
crc2 = crc32.get()

print(hex(crc1), hex(crc2))

代码生成

生成 C/C++ 代码

from crc import CRC

CRC("crc32_mpeg2").generate_for_c()

编译测试工程

cd generate/c/
cmake -S. -Bbuild
# 构建所有目标
cmake --build build --target all -- -j${nproc}
# 执行单元测试
cmake --build build --target test

接口举例

crc32_mpeg 对外接口如下,不同的参数模型只需替换 CRC32_MPEG2、crc32_mpeg 即可

// 创建 crc 变量
CRC32_MPEG2 crc;

// 初始化 crc
void CRC(crc32_mpeg, init)(CRC32_MPEG2 *crc);

// 重置分次校验值
void CRC(crc32_mpeg, reset)(CRC32_MPEG2 *crc);

// 分次校验
CRC32_MPEG2_NUM_TYPE CRC(crc32_mpeg, accum)(CRC32_MPEG2 *crc, void *data, size_t length);

// 获取分次校验值
CRC32_MPEG2_NUM_TYPE CRC(crc32_mpeg, get)(CRC32_MPEG2 *crc);

// 单次校验
CRC32_MPEG2_NUM_TYPE CRC(crc32_mpeg, calc)(CRC32_MPEG2 *crc, void *data, size_t length);

已知的 CRC 参数模型

算法名称宽度多项式初始值结果异或值输入反转输出反转
crc880x070x000x00FalseFalse
crc8_sae_j185080x1D0xFF0xFFFalseFalse
crc8_sae_j1850_zero80x1D0x000x00FalseFalse
crc8_8h2f80x2F0xFF0xFFFalseFalse
crc8_cdma200080x9B0xFF0x00FalseFalse
crc8_darc80x390x000x00TrueTrue
crc8_dvb_s280xD50x000x00FalseFalse
crc8_ebu80x1D0xFF0x00TrueTrue
crc8_icode80x1D0xFD0x00FalseFalse
crc8_itu80x070x000x55FalseFalse
crc8_maxim80x310x000x00TrueTrue
crc8_rohc80x070xFF0x00TrueTrue
crc8_wcdma80x9B0x000x00TrueTrue
crc16_ccit_zero160x10210x00000x0000FalseFalse
crc16_arc160x80050x00000x0000TrueTrue
crc16_aug_ccitt160x10210x1D0F0x0000FalseFalse
crc16_buypass160x80050x00000x0000FalseFalse
crc16_ccitt_false160x10210xFFFF0x0000FalseFalse
crc16_cdma2000160xC8670xFFFF0x0000FalseFalse
crc16_dds_110160x80050x800D0x0000FalseFalse
crc16_dect_r160x05890x00000x0001FalseFalse
crc16_dect_x160x05890x00000x0000FalseFalse
crc16_dnp160x3D650x00000xFFFFTrueTrue
crc16_en_13757160x3D650x00000xFFFFFalseFalse
crc16_genibus160x10210xFFFF0xFFFFFalseFalse
crc16_ibm160x80050x00000x0000TrueTrue
crc16_maxim160x80050x00000xFFFFTrueTrue
crc16_mcrf4xx160x10210xFFFF0x0000TrueTrue
crc16_riello160x10210xB2AA0x0000TrueTrue
crc16_t10_dif160x8BB70x00000x0000FalseFalse
crc16_teledisk160xA0970x00000x0000FalseFalse
crc16_tms37157160x10210x89EC0x0000TrueTrue
crc16_usb160x80050xFFFF0xFFFFTrueTrue
crc16_a160x10210xC6C60x0000TrueTrue
crc16_kermit160x10210x00000x0000TrueTrue
crc16_modbus160x80050xFFFF0x0000TrueTrue
crc16_x25160x10210xFFFF0xFFFFTrueTrue
crc16_xmodem160x10210x00000x0000FalseFalse
crc24_openpgp240x864cfb0xb704ce0x000000FalseFalse
crc24_flexray_a240x5d6dcb0xfedcba0x000000FalseFalse
crc24_flexray_b240x5d6dcb0xabcdef0x000000FalseFalse
crc32320x04C11DB70xFFFFFFFF0xFFFFFFFFTrueTrue
crc32_bzip2320x04C11DB70xFFFFFFFF0xFFFFFFFFFalseFalse
crc32_c320x1EDC6F410xFFFFFFFF0xFFFFFFFFTrueTrue
crc32_d320xA833982B0xFFFFFFFF0xFFFFFFFFTrueTrue
crc32_mpeg2320x04C11DB70xFFFFFFFF0x00000000FalseFalse
crc32_posix320x04C11DB70x000000000xFFFFFFFFFalseFalse
crc32_q320x814141AB0x000000000x00000000FalseFalse
crc32_jamcrc320x04C11DB70xFFFFFFFF0x00000000TrueTrue
crc32_xfer320x000000AF0x000000000x00000000FalseFalse
crc64_ecma_182640x42F0E1EBA9EA36930x00000000000000000x0000000000000000FalseFalse
crc64_go_iso640x000000000000001B0xFFFFFFFFFFFFFFFF0xFFFFFFFFFFFFFFFFTrueTrue
crc64_we640x42F0E1EBA9EA36930xFFFFFFFFFFFFFFFF0xFFFFFFFFFFFFFFFFFalseFalse
crc64_xz640x42F0E1EBA9EA36930xFFFFFFFFFFFFFFFF0xFFFFFFFFFFFFFFFFTrueTrue

在线验证平台

  1. CRC(循环冗余校验)在线计算
  2. CRC Calculator (Javascript)
  3. 16进制(CRC24)(多项式异或,多种)校验
  • 0
    点赞
  • 2
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值