【问题标题】:Python CRC for cashcode driver (From JS to Python)Cashcode 驱动程序的 Python CRC(从 JS 到 Python)
【发布时间】:2015-07-23 16:08:21
【问题描述】:

我尝试为 CashCode 重写 CCNET 驱动程序,从节点到 Python。 但是,我真的不能运行 CRC 生成器。

你可以在Github repo找到“工作”代码

这里是JS函数:

function getCRC16(bufData) {
    var POLYNOMIAL = 0x08408;
    var sizeData = bufData.length;
    var CRC, i, j;
    CRC = 0;
    for (i = 0; i < sizeData; i++) {
        CRC ^= bufData[i];
        for (j = 0; j < 8; j++) {
            if (CRC & 0x0001) {
                CRC >>= 1;
                CRC ^= POLYNOMIAL;
            } else CRC >>= 1;
        }
    }

    var buf = new Buffer(2);
    buf.writeUInt16BE(CRC, 0);
    CRC = buf;

    return Array.prototype.reverse.call(CRC);
}

我尝试crcmod,但它不是预定义函数,当我尝试设置多项式时,会出错

这是我有时工作的代码:

@staticmethod
    def getCRC16(data):
        CRC = 0
        for i in range(0, len(data), 2):
            CRC ^= int(str(data[i:(i+2)]), 16)
            for j in range(8):
                if (CRC & 0x0001):
                    CRC >>= 1
                    CRC ^= 0x8408
                else:
                    CRC >>= 1
        CRC = format(CRC, '02x')
        return CRC[2:4] + CRC[0:2]

我明白了

CRC ^= int(str(data[i:(i+2)]), 16)
ValueError: invalid literal for int() with base 16: '\x02\x03'

帮助我使用该功能。 (输入二进制/整数或十六进制字符串)

UPD: :它适用于 bytearray.fromhex(data) 。谢谢)

@staticmethod 
def getCRC16(data):
    data = bytearray.fromhex(data)
    CRC = 0
    for bit in data:
        CRC ^= bit
        for j in range(0, 8):
            if (CRC & 0x0001):
                CRC >>= 1
                CRC ^= 0x8408
            else:
                CRC >>= 1
    CRC = format(CRC, '02x')
    return CRC[2:4] + CRC[0:2]

【问题讨论】:

    标签: javascript python serial-port crc16


    【解决方案1】:

    你需要

    my_int = struct.unpack("h",data[i:i+2])
    # my_int = 770 ?
    

    您还需要通过与 0xFFFF 相加来截断结果(我认为)(因为 python 整数将永远保持上升)

    【讨论】:

      【解决方案2】:

      Sinse Python 2.6:bytearray.fromhex(data).

      例如

      for byte in bytearray.fromhex(data):
      CRC ^= byte
      ...
      

      【讨论】:

        猜你喜欢
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 2020-05-22
        • 2015-04-12
        • 2017-11-26
        • 2018-06-15
        • 2018-11-10
        • 2012-11-30
        相关资源
        最近更新 更多