使用 python 计算 CRC 16

Posted

技术标签:

【中文标题】使用 python 计算 CRC 16【英文标题】:CRC 16 calculation using python 【发布时间】:2021-10-28 20:56:30 【问题描述】:

我有一个从串行端口读取 7E0003000204009b387E 的传入数据包。

开始和结束标志为 7E,FCS/CRC 为 9b38,数据为 00030002000400。FCS 是根据 RFC 1662 中指定的算法计算的。https://www.rfc-editor.org/rfc/rfc1662#appendix-A

谁能提供一种在python中计算crc16的方法。

这是我正在寻找的 C# 等价物。

public static class Crc16

    const ushort polynomial = 0x1021;

    static readonly ushort[] table = new ushort[256];

    public static ushort ComputeChecksum(byte[] bytes)
    
        ushort crc = 0xffff;
        for (int i = 0; i < bytes.Length; ++i)
        
            byte index = (byte)(crc ^ bytes[i]);
            crc = (ushort)((crc >> 8) ^ table[index]);
        
        return (ushort)~crc;
    

    static Crc16()
    
        ushort value;
        ushort temp;
        for (ushort i = 0; i < table.Length; ++i)
        
            value = 0;
            temp = i;
            for (byte j = 0; j < 8; ++j)
            
                if (((value ^ temp) & 0x0001) != 0)
                
                    value = (ushort)((value >> 1) ^ polynomial);
                
                else
                
                    value >>= 1;
                
                temp >>= 1;
            
            table[i] = value;
        
    

【问题讨论】:

我们不会在 *** 上为您编写代码,但如果您已经有工作的 C# 代码,为什么还需要 python? 你做了什么尝试?与您的想象相反,*** 不是免费的定制软件设计和编码服务。 看起来不像,但这些文章和模块可能会有所帮助。 How do I create an FCS for PPP packets?、crc16 0.1.1、crcmod 1.7、pycrc 0.9.2、pythoncrc 1.21、PyCRC-Hex 1.1.0 【参考方案1】:

*** 不是代码编写服务,你这个坏人。

这里有一些代码:

import crcmod
f = crcmod.mkCrcFun(0x11021, initCrc=0, xorOut=0xffff)
print(hex(f(b'\x00\x03\x00\x02\x04\x00')))

输出是:

0x389b

请注意,CRC 会以 little-endian 顺序放入数据包中。

【讨论】:

以上是关于使用 python 计算 CRC 16的主要内容,如果未能解决你的问题,请参考以下文章

Python计算CRC16

逆向工程得到 CRC16 多项式

计算 CRC16 (Modbus) 值的函数

计算CRC校验值(CRC16和CRC32)(网络传输检验)

text 使用STL在S7 CPU中计算crc16

计算 CRC16 校验和的函数