在Python中计算CRC16

时间:2016-02-04 15:59:58

标签: python python-2.7 crc16

我尝试使用crcmod Python模块和2.7版本的Python解释器基于 CRC-16 算法评估适当的校验和。校验和参数是:

  • CRC顺序:16
  • CRC多项式:0x8005
  • 初始值:0xFFFF
  • 最终价值:0x0000
  • 直接:真实

代码:

crc16 = crcmod.mkCrcFun(0x18005, rev=False, initCrc=0xFFFF, xorOut=0x0000)
print hex(crc16(str(int(0x5A0001))))

并且对于输入0x5A0001,它会打印0x7E16,而我应该得到类似0xCE0A的内容。

我查看了http://www.lokker.net/Java/crc/CRCcalculation2.htm,计算出的值是0xACE,这是正确的(相对于订单而言)。

4 个答案:

答案 0 :(得分:2)

crcmod工作正常。你没有给它你认为你给它的三个字节。您的str(int(0x5A0001))提供七个字节,即ASCII字符5898241 - 0x5a0001到十进制的转换。

要将字节0x5a 0x00 0x01提供给它,您将改为(作为一种方法):

print hex(crc16("5a0001".decode("hex")))

打印0xace

答案 1 :(得分:0)

这是CRC-16 / CCITT-FALSE的python实现

def crc16(data : bytearray, offset , length):
    if data is None or offset < 0 or offset > len(data)- 1 and offset+length > len(data):
        return 0
    crc = 0xFFFF
    for i in range(0, length):
        crc ^= data[offset + i] << 8
        for j in range(0,8):
            if (crc & 0x8000) > 0:
                crc =(crc << 1) ^ 0x1021
            else:
                crc = crc << 1
    return crc & 0xFFFF
  • data:您要为其计算CRC的数据的字节数组
  • offset:要从哪个偏移量开始计算CRC
  • length:您要计算CRC的偏移量

答案 2 :(得分:0)

def crc16(数据:字节数组,偏移量,长度):     如果data为None或offset <0或offset> len(data)-1,并且offset + length> len(data):         返回0     打印(“ uzunluk =”,len(data))     打印(数据)

import React, { useEffect, useState } from "react";
import ReactDOM from "react-dom";

function getRandomInt(max) {
  return Math.floor(Math.random() * Math.floor(max));
}

async function fetchData(setState) {
  const wait = getRandomInt(5);
  await new Promise(resolve => setTimeout(resolve, wait * 1000));
  setState(wait);
}

function Tile() {
  const [title, setTitle] = useState("");

  useEffect(() => {
    fetchData(setTitle);
  }, []);

  return <div>{title}</div>;
}

function App() {
  const [title, setTitle] = useState("");

  useEffect(() => {
    fetchData(setTitle);
  }, []);

  return (
    <div>
      <div>{title}</div>
      <Tile />
      <Tile />
      <Tile />
      <Tile />
    </div>
  );
}

const rootElement = document.getElementById("root");
ReactDOM.render(<App />, rootElement);

答案 3 :(得分:0)

基于pycrc代码的CRC-16-ANSI和CRC-16-IBM的工作单功能示例。

易于修改,但不包括输入或输出反射功能:

def crc16(data: bytes):
    xor_in = 0x0000  # initial value
    xor_out = 0x0000  # final XOR value
    poly = 0x8005  # generator polinom (normal form)

    reg = xor_in
    for octet in data:
        # reflect in
        for i in range(8):
            topbit = reg & 0x8000
            if octet & (0x80 >> i):
                topbit ^= 0x8000
            reg <<= 1
            if topbit:
                reg ^= poly
        reg &= 0xFFFF
        # reflect out
    return reg ^ xor_out