- html - 出于某种原因,IE8 对我的 Sass 文件中继承的 html5 CSS 不友好?
- JMeter 在响应断言中使用 span 标签的问题
- html - 在 :hover and :active? 上具有不同效果的 CSS 动画
- html - 相对于居中的 html 内容固定的 CSS 重复背景?
我遇到了一个据称非常高效和优雅的 CRC 实现,我正试图真正理解所有步骤。我了解迭代每一位的 CRC-CCITT 0x1021 实现,但我正在努力获得这一点。这是代码。
/*
* Original Code by Ashley Roll
*/
uint16_t crc16(uint8_t* data, uint16_t length){
uint8_t x;
uint16_t crc = 0xFFFF;
while (length--){
x = crc >> 8 ^ *data++;
x ^= x>>4;
crc = (crc << 8) ^ ((uint16_t)(x << 12)) ^ ((uint16_t)(x <<5)) ^ ((uint16_t)x);
}
return crc;
}
谁能更深入地向我解释 x 变量是怎么回事?这是我到现在为止能够掌握的内容
x = crc >> 8 ^ *data++; // Here, we take the high byte of the register
// and we XOR it with the next 8 bits of data. Why?
x ^= x>>4; // Then, we XOR it with its last four bits?
// And we always remain with 4 possible non-zero bits, right?
// Why do we do this?
crc = (crc << 8) ^ ((uint16_t)(x << 12)) ^ ((uint16_t)(x <<5)) ^ ((uint16_t)x);
// Finally, we drop the oldest (highest) byte from the register
// And XOR it with rotations of x, according to the polynomial
// 0x1021, which is x^16 + x^12 + x^5 + 1
// Is (16-12) = 4 the reason why x has 4 possible non-zero bits?
我猜这个算法只是相当于按位算法的 8 个循环,但我希望得到一些说明。感谢您的宝贵时间。
最佳答案
如果代码包含一条注释,即 x 是用于使用二进制无借位除法一次处理 8 位的商,那将会有所帮助。
crc将数据+16个pad bits的零除以多项式,余数就是CRC。
poly = x^16 + x^12 + x^5 + 1 = 0x11021 = 10001000000100001 (binary)
要一次处理 8 位,每一步将位 aaaabbbb0000000000000000 除以 10001000000100001,其中 aaaabbbb 是与下一个数据字节异或的 crc 的高 8 位。这可以通过记下商 = x = (aaaabbbb)^(aaaabbbb>>4) = aaaacccc 在单个除法步骤中完成,其中 c = a^b,因此 a^c = b,并且 a^b^c = 0:
aaaacccc
--------------------------
10001000000100001 | aaaabbbb0000000000000000
aaaacccc
aaaacccc
aaaacccc
aaaacccc
----------------
cccbaaacbbbacccc
在问题代码中,不会生成 x^16 以上的位,因为已知它们会抵消 x^16 到 x^23 位。 12的左移移出高4位,对应位x^16到x^19,没有16的左移。
example: data = 0x31 0x32 = 00110001 00110010
crc = 1111111111111111
x = (crc>>8)^00110001 = 11001110
q = (x)^(x>>4) = 11000010
11000010
-------------------------
10001000000100001 |110011100000000000000000
11000010
11000010
11000010
11000010
----------------
0011100010000010
crc = (crc<<8)^0011100010000010 = 1100011110000010
x = (crc>>8) ^ 00110010 = 11110101
q = (x)^(x>>4) = 11111010
11111010
-------------------------
10001000000100001 |111101010000000000000000
11111010
11111010
11111010
11111010
----------------
1011111110111010
crc = (crc<<8)^1011111110111010 = 0011110110111010 = 0x3dba
正如所评论的,查表应该更快。如果 cpu 具有快速无进位乘法,例如 X86 pclmulqdq,则可以使用更快的汇编程序,但它超过 500 行长(使用 xmm 寄存器一次并行“折叠”128 个字节)。下面的汇编代码没有记录常量(rk ...);它们是 2 模用于“折叠”的多项式的幂,除了 rk7 =“(2^n)/多项式”和 rk8 = 多项式。
https://github.com/intel/isa-l/blob/master/crc/crc16_t10dif_01.asm
我将代码转换为 Visual Studio ML64.EXE (MASM) 和 Windows,并拥有 crc16、crc32、crc64、非反射(非反向)和反射的源代码。
关于c - 了解高效的 CRC-CCITT-16 实现,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/58795372/
我正在制作一个程序,它将与引导加载程序通信以更新微 Controller 的固件。除了CRC 计算,一切都准备就绪。 我使用 here 的 CRC 计算函数计算多项式 x16 + x12 + x5 +
问题 我正在为嵌入式设备编写代码。 CRC-CCITT 16位计算的许多解决方案都需要库。 鉴于使用库几乎是不可能的,并且会消耗其资源,因此需要一个功能。 可能的解决方案 在网上找到以下CRC计算。但
基于 Online CRC calculation , 当我输入十六进制字符串数据 = 503002080000024400003886030400000000010100 我得到结果 CRC-CCI
试图理解this在解释 CRC16 CCITT 时,我遇到了术语“截断多项式”。将一个字节消息的长手计算与相应的C代码进行比较,发现poly的宏定义与上面的计算示例不符。在 C 代码中,多项式是 0x
我有一组十六进制值。我已经预先计算了它的 CRC-CCITT (0x1d0f),它是:0xD7F2 我基于用 javascript 编写的工作 crc alghoritm 编写了一个 alghorit
我正在分析来自使用 CRC-CCITT16 (Kermit) 的 GPS 的提要对于下面的消息 来自 GPS 设备的消息: (byte) 0x3,(byte) 0xfb,(byte) 0x0,(byt
有人知道 CRC16-CCITT 的一些 CRC 测试向量吗? ? 我没有可以信任的 CRC 实现,需要测试某人的实现或我自己的实现。 (对于 CRC32,我使用 PNG code 作为黄金标准,因为
有人可以帮我用 Delphi 实现 CRC-CCITT (0xFFFF) 吗? 已经获得 Java 版本,但对如何将其移植到 Delphi 感到困惑 public static int CRC16CC
我正在尝试获取 16 位 CRC CCITT FALSE。我正在使用此页面来检查它。 http://www.sunshine2k.de/coding/javascript/crc/crc_js.htm
我正在使用 boosts crc CCITT。我需要随意输入 crc 计算的值,因此数组大小会有所不同,这就是我选择动态数组的原因。但问题是当我使用动态数组时得到不同的结果,这是为什么?还是我在这里做
我如何快速实现 CRC-CCITT。我设法让它在 Java 上运行 public static String createCRC(String string) { String crcCode
我想从字节码播放音频文件。我已经有了音频文件的字节码。但是当我使用 System.Media.SoundPlayer 播放时,出现错误“{Sound API 仅支持播放 PCM 波形文件。”}。我的音
我遇到了一个据称非常高效和优雅的 CRC 实现,我正试图真正理解所有步骤。我了解迭代每一位的 CRC-CCITT 0x1021 实现,但我正在努力获得这一点。这是代码。 /* * Original C
我正在寻找对 CCITT Group 4 压缩算法的足够描述,以便我可以从中编写功能代码。有谁知道在哪里可以找到它? 最佳答案 您可以在此处找到规范:http://www.itu.int/rec/T-
这是一个关于 TIFF 和压缩的问题。我有数百个 LZW 压缩的 tiff 图像。我想知道,是否可以将它们转换为 CCITT T.6?有一些API吗?请帮忙。 最佳答案 LZW 压缩几乎可以用来压缩任
有没有人使用过将图像编码为 ccitt 的 PDF。我使用 Xamarin,几乎所有的 pdf 似乎都可以工作。但是这种编码似乎很困难。该应用程序适用于 iOS。页面大小正确但完全空白。 var pa
我需要计算作为参数传递的数据的 CCITT 16 位校验和值以及长度。如果我用测试数据“123456789”填充我的数组 TempStr,使用长度不包括空终止字符的多项式 0x8408,我得到结果字符
在这个问题的答案中:c++ decode CCITT encoded images in pdfs 指出libtiff可用于解码CCITT编码的图像。当然,我们必须预先添加一个 TIFF header
嗨我通过蓝牙连接接收了一些数据。该数据有一个 16 位 CRC 16-CCITT block ,我想使用它来验证数据是否已成功传输且没有错误。java或android中是否有任何内置方法可以帮助我,或
创建 tiff 文件,使用 LZW 压缩(默认):- System.Drawing.Bitmap bitmap = new System.Drawing.Bitmap(800, 1000); Grap
我是一名优秀的程序员,十分优秀!