- android - 多次调用 OnPrimaryClipChangedListener
- android - 无法更新 RecyclerView 中的 TextView 字段
- android.database.CursorIndexOutOfBoundsException : Index 0 requested, 光标大小为 0
- android - 使用 AppCompat 时,我们是否需要明确指定其 UI 组件(Spinner、EditText)颜色
我正在制作一个程序,它将与引导加载程序通信以更新微 Controller 的固件。除了CRC 计算
,一切都准备就绪。
我使用 here 的 CRC 计算函数计算多项式 x16 + x12 + x5 + 1
(0b10001000000100001) 的 CRC16。
但是输入 0x3304000012345678
的结果是错误的。我检查过这个 website 。此外,我已经仔细检查了我正在 C
中复制的 python 脚本。 python 脚本正确计算了 CRC
。
这是网站上的代码:
uint16_t crc16(uint8_t *data_p, unsigned length)
{
unsigned char i;
unsigned int data;
unsigned int crc = 0xffff;
if (length == 0)
return (~crc);
do
{
for (i=0, data=(unsigned int)0xff & *data_p++;
i < 8;
i++, data >>= 1)
{
if ((crc & 0x0001) ^ (data & 0x0001))
crc = (crc >> 1) ^ POLY;
else crc >>= 1;
}
} while (--length);
crc = ~crc;
data = crc;
crc = (crc << 8) | (data >> 8 & 0xff);
return (crc);
}
最佳答案
我将您发布的 C 代码与您链接的网站上的算法进行了比较,发现了两个主要区别:
1) 您发布的 C 代码以与网站相反的顺序处理这些位。对于 CRC 计算本身(右移,网站左移)和每个输入字节的处理(首先处理最低有效位,网站首先处理最高有效位)都是如此。
2) C 代码在返回 CRC 值之前将 CRC 值中的所有位取反,并交换低字节和高字节。该网站的算法不包含此类后处理。
我已经更新了您粘贴的 C 代码以匹配网站:
uint16_t crc16(const uint8_t *data_p, unsigned length)
{
unsigned char i;
uint8_t data;
unsigned int crc = 0; // 0xffff;
while (length-- > 0)
{
for (i = 0, data = *data_p++;
i < 8;
i++, data <<= 1)
{
if ((crc >> 15) ^ (data >> 7))
crc = (crc << 1) ^ POLY;
else
crc <<= 1;
crc &= 0xffff;
}
}
return crc;
}
区别:
1) data
局部变量现在是 uint8_t
类型.
2) crc
正如@AShelly 所建议的那样,变量被初始化为 0 而不是 0xFFFF。该网站特别提到它在开始计算之前将所有寄存器初始化为 0。
3) 我没有单独测试长度 0,而是将循环从“do”循环重组为“while”循环,这样如果“length”它就不会首先进入循环为 0。
4) 在 for
中循环,data
向左移动而不是向右移动。这是因为我们想先处理它的 high 位,然后是它右边的位,依此类推——左移将每个后续位移到高位位置。
5) if
将进位与输入的新位组合的语句现在将 CRC 的高位 (crc >> 15
) 与数据的高位 (data >> 7
) 进行比较,而不是将每个位的低位进行比较。其余代码确保 crc
不会有位在第16位,data
第 8 个位置不会有位,因此这些移位保证只会产生一个位。
6) 实际crc
计算向左移动而不是向右移动。
7) 转移后crc
在左侧,我屏蔽了位置 16 之后的任何位。这是第 4 点中提到的代码的一部分,它确保 crc >> 15
只产生一位。 (这也可以通过将 crc
设为 uint16_t
类型来完成。)
8) 删除了后处理代码。决赛crc
循环完成时按原样返回值。
通过这些更改,C 函数生成的 CRC 与网站匹配。
关于CRC16-CCITT 结果不正确?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/41881228/
我正在制作一个程序,它将与引导加载程序通信以更新微 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
我是一名优秀的程序员,十分优秀!