天道酬勤,学无止境

how to calculate ANSI CRC16 polynomial (0x8005) in python3?

I tried to calculate ANSI CRC16 polynomial (0x8005) using this code

import crcmod
crc16 = crcmod.mkCrcFun(0x8005, 0xffff, True)

but I got this error message

ValueError: The degree of the polynomial must be 8, 16, 24, 32 or 64

评论

There is an implied 1 at the beginning of 0x8005

crcmod expects you to provide the 1 explicitly

import crcmod
crc16 = crcmod.mkCrcFun(0x18005, 0xffff, True)

受限制的 HTML

  • 允许的HTML标签:<a href hreflang> <em> <strong> <cite> <blockquote cite> <code> <ul type> <ol start type> <li> <dl> <dt> <dd> <h2 id> <h3 id> <h4 id> <h5 id> <h6 id>
  • 自动断行和分段。
  • 网页和电子邮件地址自动转换为链接。

相关推荐
  • 如何从C#生成CRC-16(How to generate a CRC-16 from C#)
    问题 我正在尝试使用C#生成CRC-16。 我用于RS232的硬件要求输入字符串为十六进制。 下面的屏幕截图显示了正确的转换,对于测试,我需要8000为0xC061,但是生成CRC-16的C#方法必须能够转换任何给定的十六进制字符串。 我尝试使用Nito.KitchenSink.CRC 我也尝试了以下在输入8000时生成8009的方法- public string CalcCRC16(string strInput) { ushort crc = 0x0000; byte[] data = GetBytesFromHexString(strInput); for (int i = 0; i < data.Length; i++) { crc ^= (ushort)(data[i] << 8); for (int j = 0; j < 8; j++) { if ((crc & 0x8000) > 0) crc = (ushort)((crc << 1) ^ 0x8005); else crc <<= 1; } } return crc.ToString("X4"); } public Byte[] GetBytesFromHexString(string strInput) { Byte[] bytArOutput = new Byte[] { }; if (!string
  • 如何计算CRC32校验和?(How is a CRC32 checksum calculated?)
    问题 也许我只是看不到它,但是CRC32似乎不必要地复杂,或者在我能在网上找到的任何地方都没有足够的解释。 我知道这是消息值的非基于进位算术除法的余数,再除以(生成器)多项式,但是它的实际实现使我无所适从。 我已经阅读了《 CRC错误检测算法的无痛指南》,我必须说这并非没有痛苦。 它在理论上讲得相当不错,但是作者从来没有想到一个简单的“就是这样”。 他确实说过标准CRC32算法的参数是什么,但他却忽略了清楚地说明如何获得它的方法。 让我感到高兴的部分是,当他说“这就是它”并接着说:“哦,顺便说一句,它可以被颠倒或以不同的初始条件开始”,而没有给出最终方法的明确答案。考虑到他刚刚添加的所有更改,计算CRC32校验和的过程。 关于CRC32的计算方式是否有更简单的解释? 我试图用C编写表的形成方式的代码: for (i = 0; i < 256; i++) { temp = i; for (j = 0; j < 8; j++) { if (temp & 1) { temp >>= 1; temp ^= 0xEDB88320; } else {temp >>= 1;} } testcrc[i] = temp; } 但这似乎产生了与我在互联网上其他地方发现的价值观不一致的价值观。 我可以使用在网上找到的值,但是我想了解它们是如何创建的。 在清理这些难以置信的混乱号任何帮助将是非常赞赏。
  • Function to Calculate a CRC16 Checksum
    I'm working on a library to provide simple reliable communication over an RS232 or RS485 connection. Part of this code involves using a CRC16 checksum on the data to detect corruption from line noise. I've created a function to calculate a CRC16 checksum, but it doesn't seem to be outputting correct values. The relevant code I've written is below (it can also be found here). #include <stdint.h> #define CRC16 0x8005 uint16_t gen_crc16(const uint8_t *data, uint16_t size) { uint16_t out = 0; int bits_read = 0, bit_flag; /* Sanity check: */ if(data == NULL) return 0; while(size > 0) { bit_flag =
  • 计算CRC16校验和的函数(Function to Calculate a CRC16 Checksum)
    问题 我正在开发一个库,以通过RS232或RS485连接提供简单可靠的通信。 此代码的一部分涉及对数据使用CRC16校验和,以检测线路噪声引起的损坏。 我创建了一个函数来计算CRC16校验和,但似乎未输出正确的值。 我编写的相关代码如下(也可以在此处找到)。 #include <stdint.h> #define CRC16 0x8005 uint16_t gen_crc16(const uint8_t *data, uint16_t size) { uint16_t out = 0; int bits_read = 0, bit_flag; /* Sanity check: */ if(data == NULL) return 0; while(size > 0) { bit_flag = out >> 15; /* Get next bit: */ out <<= 1; out |= (*data >> (7 - bits_read)) & 1; /* Increment bit counter: */ bits_read++; if(bits_read > 7) { bits_read = 0; data++; size--; } /* Cycle check: */ if(bit_flag) out ^= CRC16; } return out; }
  • CRC校验查表法原理及实现(CRC-16)
    绪论 在网上浏览了很多关于CRC校验的文章,基本上都是针对CRC校验原理的阐述以及关于CRC校验查表法的实际应用以及具体软件实现方法。 至于查的表是怎么来的,软件为什么要这样实现很多文章并没有说明。本篇文章就针对这两点问题进行总结和归纳,有错误的地方欢迎大家评论区指出,不胜感激。 注意:本篇文章不涉及CRC校验的基本原理,如果不了解CRC的基本原理,请移步至如下链接: CRC查找表法推导及代码实现比较 以下的CRC查表法的软件实现及推导过程均建立在modbusRTU协议使用的CRC-16标准。 查表法的表是怎么来的? CRC16算法的生成多项式 x 16 + x 15 + x 2 + 1 x^{16}+x^{15}+x^2+1 x16+x15+x2+1,十六进制表示为0x8005。 CRC16常见的表格中的数据是按照先传输LSB,消息右移进寄存器来计算的。因此需要判断寄存器的最低位LSB,同时要将0x8005按位颠倒后(0xA001)根据LSB的情况决定是否与寄存器异或即可。 CRC16的表格中对应的数依次为0~255计算出来的CRC值,因此,此处只选取其中一两个数作为实例计算CRC值。 具体步骤如下所示: 1)从0~255中选取需要计算的数,将其对应的十六进制数放入一个长度为16的寄存器的低八位,高八位填充0; 2)如果寄存器的末位LSB为1,将寄存器的数值右移1位
  • 我如何猜测校验和算法?(How could I guess a checksum algorithm?)
    问题 假设我有一些数据包的末尾带有16位校验和。 我想猜测使用哪种校验和算法。 首先,从转储数据中,我可以看到数据包有效负载中的一个字节变化完全改变了校验和,因此我可以假定它不是某种简单的XOR或求和。 然后,我尝试了几种CRC16的变体,但运气不佳。 这个问题可能更偏向于密码学,但是我对任何易于理解的统计工具来找出这可能是CRC感兴趣。 如果其他所有方法都失败了,我什至可以转向绘制不同的CRC算法。 背景故事:我有带有某种校验和的串行RFID协议。 我可以毫无问题地重放消息,并解释结果(不进行校验和检查),但是由于设备将其丢在了地板上,所以我无法发送修改后的数据包。 使用现有软件,我可以更改RFID芯片的有效载荷。 但是,唯一的序列号是不可变的,因此我无法检查所有可能的组合。 尽管我可以生成递增1的值的转储,但不足以使详尽搜索适用于此问题。 如果问题本身还不够,则可以使用带有数据的转储文件:-) 需要参考文件吗? CRC错误检测算法的无忧指南是很好的参考,我在这里提出问题后就找到了。 最后,在给出了可接受的答案(比CCITT有用的提示)之后,我使用了此CRC计算器,并将生成的校验和与已知的校验和进行异或运算,得到0xffff,这使我得出结论:最终的xor是CCITT的0x0000的instread的0xffff。 回答1 CRC有很多变量需要考虑: Polynomial No
  • Java中多项式x^16 + x^12 + x^5 + 1计算CCITT标准CRC(Calculation of CCITT standard CRC with polynomial x^16 + x^12 + x^5 + 1 in Java)
    问题 我需要在 Java 中使用多项式 x^16 + x^12 + x^5 + 1 (0x1081) 计算 CCITT 标准 CRC 的帮助。 我在互联网上尝试了许多示例,但每个示例都返回示例中的值以外的其他值。 例如,对于这个数组 [0xFC] [05] [11],结果需要是 [27] [56]。 使用此代码: public static void main(String[] args) { byte[] array = new byte[3]; array[0] = (byte) 0xFC; array[1] = (byte) 0x05; array[2] = (byte) 0x11; // array[3] = (byte) 0x00; // array[4] = (byte) 0x00; System.out.println(Integer.toHexString(crc16(array))); } private static final int POLYNOMIAL = 0x1081; private static final int PRESET_VALUE = 0xFFFF; public static int crc16(byte[] data) { int current_crc_value = PRESET_VALUE; for (int i = 0; i <
  • 如何配置CRC表的计算(How to configure calculation of CRC table)
    问题 那里有很多CRC计算示例。 带有位移的简单实现,并通过预先计算的表更有效。 但是多项式旁边还有很多CRC参数会影响计算。 您可以在此处评估这些参数:http://zorc.breitbandkatze.de/crc.html 这些参数是 CRC的初始值输入数据的反映反映输出数据 CRC的最终XOR值 对于某些“标准” CRC算法,这些参数已很好定义,例如CRC-16(CCITT)。 但是有些实现使用不同的参数。 我的实现必须与CCITT多项式(x 16 + x 12 + x 5 +1)的CRC16兼容。 但是必须反映数据字节和最终的CRC。 我已经在计算方法中实现了这些反射。 但这很耗时。 为了获得最佳性能,必须将其从计算中删除。 在初始化方法中如何计算CRC的反射参数? 编辑:我应该怎么做才能分别控制每个参数? 我想了解Init函数的实际工作方式以及所有参数的实现方式。 typedef unsigned char uint8_t; typedef unsigned short crc; crc crcTable[256]; #define WIDTH (8 * sizeof(crc)) #define TOPBIT (1 << (WIDTH - 1)) #define POLYNOMIAL 0x1021 template<typename t> t reflect(t v)
  • Calculation of CCITT standard CRC with polynomial x^16 + x^12 + x^5 + 1 in Java
    I need help with calculating of CCITT standard CRC with polynomial x^16 + x^12 + x^5 + 1 (0x1081) in Java. I have tried many examples on the internet but every one of them returns other values than the ones in the example. For example for this array [0xFC] [05] [11] the result needs to be [27] [56]. Using this code: public static void main(String[] args) { byte[] array = new byte[3]; array[0] = (byte) 0xFC; array[1] = (byte) 0x05; array[2] = (byte) 0x11; // array[3] = (byte) 0x00; // array[4] = (byte) 0x00; System.out.println(Integer.toHexString(crc16(array))); } private static final int
  • How to configure calculation of CRC table
    There are a lot of CRC calculation examples out there. Simple implementations with bit shifting and more efficient with a pre-calculated table. But there are also a lot of Parameters of a CRC beside the polynomial that affect the calculation. You can evaluate these parameters here: http://zorc.breitbandkatze.de/crc.html These parameters are initial value of CRC reflection of input data reflection of output data final XOR value for CRC For some "standard" CRC algorithm these parameters are well defined, like CRC-16 (CCITT). But there are some implementations that use different parameters. My
  • CCITT CRC 16 Bit Start Value 0xffff
    I need to calculate a CCITT 16 bit checksum value for data passed as a parameter together with the length. If I fill my array TempStr with the test data "123456789", use the polynomial 0x8408 with the length excluding the null termination character, I get the result string 6E90(Hex). Together with the null termination char I get 907A. When I swap out the polynomial to 0x1201 then I get results 29E2(Hex) and EFE8(Hex) with and without termination character. My questions are: Do I need to calculate the CRC with or without the null termination character to obtain the correct value? Do I use the
  • CCITT CRC 16 位起始值 0xffff(CCITT CRC 16 Bit Start Value 0xffff)
    问题 我需要计算作为参数与长度一起传递的数据的 CCITT 16 位校验和值。 如果我用测试数据“123456789”填充我的数组 TempStr,使用长度不包括空终止字符的多项式 0x8408,我得到结果字符串 6E90(Hex)。 连同空终止字符,我得到 907A。 当我将多项式交换为 0x1201 时,我会得到带有和不带有终止符的结果 29E2(Hex) 和 EFE8(Hex)。 我的问题是:我是否需要计算带有或不带有空终止符的 CRC 以获得正确的值? 我在算法中使用多项式 0x1201 还是逆多项式 0x8408? 给定数据 0x29B1 的 CRC 是否正确? 我需要正确的值来确定函数是否正常工作。计算此特定 CRC 类型的算法是否正确? wData=(unsigned int)0xff & *pData++?? 如果有人可以向我解释出了什么问题以及如何解决我的问题,我将不胜感激。 谢谢 这是使用和显示 calculate_CRC16 函数的代码: CHAR_t TestStr[] = {"123456789"}; unsigned short CrcTest = calculate_CRC16(TestStr,sizeof(TestStr)-1); QString CrcDisplay = QString("CrcTest : %1").arg(CrcTest)
  • 循环冗余码校验
    循环冗余码校验(Cyclic Redundancy Check) 5.3.2 循环冗余校验检错方案 上节介绍的奇偶校验码(PCC)只能校验一位错误,本节所要介绍的循环冗余校验码(CRC)的检错能力更强,可以检出多位错误。 1. CRC校验原理 CRC校验原理看起来比较复杂,好难懂,因为大多数书上基本上是以二进制的多项式形式来说明的。其实很简单的问题,其根本思想就是先在要发送的帧后面附加一个数(这个就是用来校验的校验码,但要注意,这里的数也是二进制序列的,下同),生成一个新帧发送给接收端。当然,这个附加的数不是随意的,它要使所生成的新帧能与发送端和接收端共同选定的某个特定数整除(注意,这里不是直接采用二进制除法,而是采用一种称之为"模 2 除法 ")。到达接收端后,再把接收到的新帧除以(同样采用"模2除法")这个选定的除数。因为在发送端发送数据帧之前就已通过附加一个数,做了"去余"处理(也就已经能整除了),所以结果应该是没有余数。如果有余数,则表明该帧在传输过程中出现了差错。 【说明】"模2除法"与"算术除法"类似,但它既不向上位借位,也不比较除数和被除数的相同位数值的大小,只要以相同位数进行相除即可。模2加法运算为:1+1=0,0+1=1,0+0=0,无进位,也无借位;模2减法运算为:1-1=0,0-1=1,1-0=1,0-0=0,也无进位,无借位。相当于二进制中的逻辑异或运算
  • How to calculate CRC-16 from HEX values?
    In my code i need to calculate CRC-16 16 bit values for the HEX values stored as NSdata, below is the code snippet to calculate CRC-16 in c. void UpdateCRC(unsigned short int *CRC, unsigned char x) { // This function uses the initial CRC value passed in the first // argument, then modifies it using the single character passed // as the second argument, according to a CRC-16 polynomial // Arguments: // CRC -- pointer to starting CRC value // x -- new character to be processed // Returns: // The function does not return any values, but updates the variable // pointed to by CRC static int const
  • 纠错码CRC详细计算(精华)
    1. CRC CRC(Cyclic Redundancy Check)循环冗余校验码,是常用的校验码.对通信的可靠性检查就需要‘校验’,校验是从数据本身进行检查,它依靠某种数学上约定的形式进行检查,校验的结果是可靠或不可靠,如果可靠就对数据进行处理,如果不可靠,就丢弃重发或者进行修复。 CRC码是由两部分组成,前部分是信息码,就是需要校验的信息,后部分是校验码,如果CRC码共长n个bit,信息码长k个bit,就称为(n,k)码。 它的编码规则是: 1、首先将原信息码(kbit)左移r位(k+r=n) 2、运用一个生成多项式g(x)(也可看成二进制数,是事先定义好了的)用模2除上面的式子,得到的余数就是校验码。3.多项式的二进制数位数是r(原信息的左移位)+1位. 非常简单,要说明的:模2除就是在除的过程中用模2加,模2加实际上就是我们熟悉的异或运算,就是加法不考虑进位,公式是: 0+0=1+1=0,1+0=0+1=1即‘异’则真,‘非异’则假。 有了加法就可以用来定义模2除法,于是就可以用生成多项式g(x)生成CRC校验码。例如: g(x)=X4+X3+X2+1,(7,3)码,信息码110产生的CRC码就是: 101 商11101 | 1100000 11101 10100 11101 1001 余数余数是1001,所以CRC码是110,1001标准的CRC码是,CRC
  • CRC通用计算类
    /*前段时间在做项目中用到了CRC循环校验,在网上查了很多资料,但是都很零乱;本人作了相关整理,并对常用的循环冗余校验进行了封装,形成本文件。在这里感谢网络上提供相关资料的朋友们,关于他们的名字在这里我无法一一列举,再次向他们表示感谢!*/ /*以下代码的计算思想适用于所有CRC校验算法。64位以上的由于ulong已经无法表示了,所以没有实现。但是思想也是一样的。不过64位以上可以使用.net里面的别的hash:比如md5等算法.主要参考地址:[url]http://www.wiki.cn/wiki/Cyclic_redundancy_check[/url][url]http://www.zorc.breitbandkatze.de/crc.html[/url] [url]http://www.zorc.breitbandkatze.de/crctester.c[/url]*/ /*需要注意的是:即使都是同样位数的crc校验,多项式也可以不同。即使多项式相同,初值,末值xor,是否反转等设置也可以不同所以在通信的双方需要约定好。以下的具体crc子类只是我能找到的一些常用的crc约定。哪位兄弟有具体的crc约定,可以告知我进行扩展。*/ //* 采用了泛型定义基类,基类是一个通用的计算CRC的方法,定义具体的类时只需要设置好CRC设置即可。//* 本来想用c#写模版代码,可是C
  • C#中的CRC-4实现(CRC-4 implementation in C#)
    问题 我一直在网上搜索4位循环冗余校验(CRC-4-ITU)的C#实现,但是到目前为止,我一直没有成功。 有谁能给我CRC-4-ITU的参考实现? 如果存在标准多项式,最好使用标准多项式(我已经读过维基百科指向的规范为CRC4规范,而没有找到该多项式的定义)。 我也非常感谢某种测试套件或测试数据来验证CRC4实现。 谢谢! 回答1 维基百科上的“循环冗余校验”文章说,多项式为x ^ 4 + x +1。关于校验和的计算方式也有相当不错的描述。 这是CRC16的算法。 我知道这不是您要的,但是将其适应4位应该相对简单。 public ushort calculate(byte[] bytes) { int crc = 0xFFFF; // initial value // loop, calculating CRC for each byte of the string for (int byteIndex = 0; byteIndex < bytes.Length; byteIndex++) { ushort bit = 0x80; // initialize bit currently being tested for (int bitIndex = 0; bitIndex < 8; bitIndex++) { bool xorFlag = ((crc & 0x8000) ==
  • 使用verilog实现CRC校验
    我是桂林理工大三苦逼通信学子🐕。 在前些日子,学习计算机网络课程的时候,接触到了数据传输和以太网传输协议,并且还要去写一个以太网传输的作业,我当时是使用了c去解决这个问题。 其中在这个大作业中,CRC校验程序的编写,无疑是重中之重。碰巧,我这个假期自学了verilog,那就让我来试试可不可以用Verilog来写一段CRC校验吧。 什么是CRC? 循环冗余校验码简称CRC(循环码),是一种能力相当强的检错、纠错码,并且实现编码和检码的电路比较简单,常用于串行传送的辅助存储器与主机的数据通信和计算机网络中。 将要传送的信息M(X)表示为一个多项式L,用L除以一个预先确定的多项式G(X),得到的余式就是所需的循环冗余校验码。 CRC如何计算? 计算CRC,我们先要明确我们使用什么CRC算法,不同的CRC算法,会导致其参与计算的多项式公式不同。 例如常见的有:CRC-8:x8+x2+x+1; CRC-32: x^32 + x^26 + x^23 + x^22 + x^16 + x^12 + x^11 + x^10 + x^8 + x^7 + x^5 + x^4 + x^2 + x + 1; 等等。 在此,我们以CRC-5/ITU为例子。CRC-5/ITU的多项式为x5+x4+x^2+1;转换为二进制,可得除数为110101; 其次,除了多项式的确定以外,我们还需要会模2算法
  • How to generate a CRC-16 from C#
    I am trying to generate a CRC-16 using C#. The hardware I am using for RS232 requires the input string to be HEX. The screenshot below shows the correct conversion, For a test, I need 8000 to be 0xC061, however the C# method that generates CRC-16 must be able to convert any given HEX string. I have tried using Nito.KitchenSink.CRC I have also tried the below which generates 8009 when 8000 is inputted - public string CalcCRC16(string strInput) { ushort crc = 0x0000; byte[] data = GetBytesFromHexString(strInput); for (int i = 0; i < data.Length; i++) { crc ^= (ushort)(data[i] << 8); for (int j =
  • CRC 逆向工程师(来自机器/PC 的校验和)(CRC Reverse Engineer (Checksum from Machine / PC))
    问题 我目前正在寻找如何确定从机器到 PC 产生的 CRC(反之亦然)。 设备使用串行通信或 RS232 电缆进行通信。 I do only have data to be able for us to create a program to be used for both devices. The data given was from my boss and the program was corrupted. So we are trying for it to work out. I hope everyone can help. Thanks :) 回答1 The sequence to use for the CRC calculation in your protocol is the ASCII string starting from the first printing character (e.g. the 'R' from REQ) until and including the '1E' in the calculation. It's a CRC with the following specs according to our CRC calculator CRC:16,1021,0000,0000,No,No which means: CRC