在处理编程语言中转换或重写CRC-32代码

时间:2014-10-15 08:52:06

标签: c++ c processing

我在C ++中使用一段代码并在Arduino IDE中编译它来计算字节数组的CRC-32字节。我不确定是否有人熟悉Processing编程语言,但我非常感谢您的帮助,帮助我重新编写或转换这段代码以便在Processing中进行编译。据我所知,Processing是一种基于Java的语言,我并不熟悉它。

此外,我发现Processing在变量的内存分配方面并不是很灵活,特别是当你有'unsigned'变量时。正如您所看到的,在CRC代码中还有一些情况需要使用“无符号”变量,我相信这些变量会为它们分配四个字节的内存。 我非常感谢任何帮助和指导,因为我现在已经坚持了很长一段时间。

/*
The block of code that calculates the CRC-32 starts here
*/

static PROGMEM prog_uint32_t crc_table[16] = {
0x00000000, 0x1db71064, 0x3b6e20c8, 0x26d930ac,
0x76dc4190, 0x6b6b51f4, 0x4db26158, 0x5005713c,
0xedb88320, 0xf00f9344, 0xd6d6a3e8, 0xcb61b38c,
0x9b64c2b0, 0x86d3d2d4, 0xa00ae278, 0xbdbdf21c
};

unsigned long crc_update(unsigned long crc, byte data)
{
byte tbl_idx;
tbl_idx = crc ^ (data >> (0 * 4));
crc = pgm_read_dword_near(crc_table + (tbl_idx & 0x0f)) ^ (crc >> 4);
tbl_idx = crc ^ (data >> (1 * 4));
crc = pgm_read_dword_near(crc_table + (tbl_idx & 0x0f)) ^ (crc >> 4);
return crc;
}

unsigned long crc_string( unsigned char *s, unsigned int length)
{
unsigned long crc = ~0L;
unsigned int i;
for(i = 0; i<length;i++){
crc = crc_update(crc, *s++);
}
crc = ~crc;
return crc;
}

/*
The end of CRC-32 block
*/

0 个答案:

没有答案