我正在使用一个需要我生成16位CRC的设备.
该设备的数据表显示它需要以下CRC定义:
CRC Type Length Polynomial Direction Preset Residue CRC-CCITT 16 bits x16 + x12 + x5 + 1 Forward FFFF (16) 1D0F (16)
其中预置= FFFF(16位)和残留= 1D0F(16位)
我搜索了一个CRC算法并找到了这个链接:http: //www.lammertbies.nl/comm/info/crc-calculation.html
它有两个.CRC-CCITT(0xFFFF)CRC-CCITT(0x1D0F)
预设和残留物有什么区别?
我需要在混合的java/groovy应用程序中为任意字符串计算CRC-16.具体来说,我需要CRC-16-ANSI又称CRC-16-IBM变体(有关详细信息,请参阅http://en.wikipedia.org/wiki/Cyclic_redundancy_check ;这是modbus/USB版本.)
我可以实现自己的,但我更愿意找到一个已经在某种程度上已经测试过的库.
这个问题很简单地涵盖了Java中的CRC 16,但由于正在讨论的应用程序是Xmodem,所以实现的是CRC-16-CCITT,这不是我正在寻找的.
我也模糊地了解sun.misc.CRC16,但是由于Oracle重新组织了Sun网站,因此很难找到该库的文档,我似乎无法找到它实现的CRC风格.
我正在尝试计算/验证压缩bzip2档案的CRC32校验和.
.magic:16 = 'BZ' signature/magic number
.version:8 = 'h' for Bzip2 ('H'uffman coding)
.hundred_k_blocksize:8 = '1'..'9' block-size 100 kB-900 kB
.compressed_magic:48 = 0x314159265359 (BCD (pi))
.crc:32 = checksum for this block
...
...
.eos_magic:48 = 0x177245385090 (BCD sqrt(pi))
.crc:32 = checksum for whole stream
.padding:0..7 = align to whole byte
Run Code Online (Sandbox Code Playgroud)
http://en.wikipedia.org/wiki/Bzip2
所以我知道CRC校验和在bz2文件中的位置,但我将如何验证它们.我应该用什么块binascii.crc32()来获得两个CRC?我已经尝试逐字节计算各种块的CRC,但还没有设法得到匹配.
谢谢.我将研究bzip2源bz2代码和Python库代码,以便找到一些东西,特别是在decompress()方法中.
更新1:
就我所见,块标题由以下标记标识.但是小的bz2文件不包含ENDMARK文件.(感谢adw,我们发现应该查找ENDMARK的位移值,因为压缩数据没有填充到字节.)
#define BLOCK_HEADER_HI 0x00003141UL
#define BLOCK_HEADER_LO 0x59265359UL
#define BLOCK_ENDMARK_HI 0x00001772UL
#define BLOCK_ENDMARK_LO 0x45385090UL
Run Code Online (Sandbox Code Playgroud)
这是从bzlib2recover.c源,块似乎始终在第80位,就在CRC校验和之前,这应该从CRC计算中省略,因为一个人不能将它自己的CRC校准为相同的CRC(你得到我的观点) …
问题
我正在为嵌入式设备编写代码.CRC-CCITT 16位计算的许多解决方案都需要库.
鉴于使用库几乎是不可能的并且耗尽其资源,需要一个函数.
可能解决方案
在线发现以下CRC计算.但是,它的实现是不正确的.
http://bytes.com/topic/python/insights/887357-python-check-crc-frame-crc-16-ccitt
def checkCRC(message):
#CRC-16-CITT poly, the CRC sheme used by ymodem protocol
poly = 0x11021
#16bit operation register, initialized to zeros
reg = 0xFFFF
#pad the end of the message with the size of the poly
message += '\x00\x00'
#for each bit in the message
for byte in message:
mask = 0x80
while(mask > 0):
#left shift by one
reg<<=1
#input the next bit from the message into the right hand side of the …Run Code Online (Sandbox Code Playgroud) 我正在使用一个小算法修改固件文件 (.jic) JTAG 间接配置文件,但更改文件内的数据会使其无法使用,因为文件中的某处有一个校验和需要更新。
我需要找到 .jic 文件中的校验和并破译使用哪种算法(crc32 等)。
每个字节上的位都被反转,我检查了正常和反转的位文件,但没有成功。
有人知道或者有办法找出 .jic 文件中的校验和数据在哪里吗?
MurmurHash3和 xxHash等非加密哈希几乎专为哈希表设计,但它们的功能似乎与CRC-32、Adler-32和Fletcher-32相当(甚至更有利)。非加密哈希通常比 CRC-32 更快,并产生更多类似于慢速加密哈希(MD5、SHA)的“随机”输出。尽管如此,我只看到 CRC-32 或 MD5 被推荐用于数据完整性/校验和目的。
在下表中,我测试了 32 位校验和/CRC/哈希函数,以确定它们检测数据中微小差异的能力:
每个单元格中的结果意味着:A) 发现的冲突次数,以及 B) 32 个输出位中的任何一个设置为 1 的最小和最大概率。要通过测试 B,最大值和最小值应尽可能接近 50 . 任何低于 45 或高于 55 的东西都表明存在偏见。
查看表格,MurmurHash3 和Jenkins lookup2与 CRC-32(实际上未通过一项测试)相比要好得多。它们也分布良好。DJB2 和 FNV1a 通过了碰撞测试,但分布不佳。Fletcher32 和 Adler32 在 NullBytes 和 8RandBytes 测试中挣扎。
那么我的问题是,与其他校验和相比,“非加密哈希”有多适合检测文件中的错误或差异?CRC-32/Adler-32/CRC-64 是否有任何理由可能胜过任何体面的 32 位/64 位哈希?
我需要与 RS232 设备通信,我没有可用的规格或信息。
我发送一个 16 字节的命令并返回一个 16 字节的结果。最后一个字节看起来像某种 crc 或校验和,我试过使用这个http://miscel.dk/MiscEl/miscelCRCandChecksum.html没有运气。
任何人都可以对 crc/校验和算法进行逆向工程?以下是使用 RS-232 监控程序捕获的一些数据:
01 80 42 00 00 00 00 00 00 00 00 00 00 00 01 B3
01 80 42 00 00 00 00 00 00 00 00 00 00 00 02 51
01 80 42 00 00 00 00 00 00 00 00 00 00 00 03 0F
01 80 42 00 00 00 00 00 00 00 00 00 00 00 04 8C …Run Code Online (Sandbox Code Playgroud) 如果我有一定数量的字节要串行传输,我如何确定使用哪个CRC(CRC8,CRC16等,基本上是多少位CRC?)并且仍然有高错误检测百分比?有这个公式吗?
我将从我自己的类中定义的一些对象保存到File.(保存流数据).
这一切都很好,但我希望能够在File中存储该文件的CRC校验和.
然后,每当我的应用程序尝试打开文件时,它都可以读取内部存储的CRC值.
然后检查实际文件,如果文件的CRC与内部存储的CRC值匹配,我可以正常处理文件,否则显示错误消息,说文件无效.
我需要一些关于如何做到这一点的建议,我想我可以这样做:
问题是,只要在文件中更改了单个数据字节,就会导致CRC校验和完全不同 - 正如预期的那样.
我正在尝试在C#中实现Crc16.我已经尝试过很多不同的实现,但是大多数都给了我不同的值.以下是我已经使用过的一些代码.
private static int POLYNOMIAL = 0x8408;
private static int PRESET_VALUE = 0xFFFF;
public static int crc16(byte[] data)
{
int current_crc_value = PRESET_VALUE;
for (int i = 0; i < data.Length; i++)
{
current_crc_value ^= data[i] & 0xFF;
for (int j = 0; j < 8; j++)
{
if ((current_crc_value & 1) != 0)
{
current_crc_value = (current_crc_value >> 1) ^ POLYNOMIAL;
}
else
{
current_crc_value = current_crc_value >> 1;
}
}
}
current_crc_value = ~current_crc_value;
return current_crc_value & 0xFFFF; …Run Code Online (Sandbox Code Playgroud)