32 位 CRC 计算与在线生成器不匹配
32 Bit CRC calculation not matching with online generator
谁能帮我计算 32 位 CRC。
这是我用于 32 位 CRC 计算的代码片段。
static unsigned int crc32_table[256];
void make_crc_table()
{
int j;
unsigned int crc,byte, mask;
/* Set up the table, if necessary. */
if (crc32_table[1] == 0)
{
for (byte = 0; byte <= 255; byte++)
{
crc = byte;
for (j = 7; j >= 0; j--) // Do eight times
{
mask = -(crc & 1);
crc = (crc >> 1) ^ (0xEDB88320 & mask);
}
crc32_table[byte] = crc;
}
}
for (j=0;j<10;j++)
printf("crc32_table[%d] = %x\n",j,crc32_table[j]);
}
unsigned int crc32cx(unsigned int crc,unsigned char *message,int len)
{
unsigned int word;
do
{
if((word = *(unsigned int *)message) & 0xFF)
{
crc = crc ^ word;
crc = (crc >> 8) ^ crc32_table[crc & 0xFF];
crc = (crc >> 8) ^ crc32_table[crc & 0xFF];
crc = (crc >> 8) ^ crc32_table[crc & 0xFF];
crc = (crc >> 8) ^ crc32_table[crc & 0xFF];
message = message + 4;
len--;
}
}while(len == 0);
return ~crc;
}
main()
{
unsigned int crc = 0xFFFFFFFF;
unsigned char buff[100] = ABCDEFGH;
int len; // lenght in bytes
len = (((strlen(buff)%8)==0) ? (strlen(buff)/8) : ((strlen(buff)/8)+1));
printf("lenght in bytes %d\n",len);
make_crc_table();
printf("crc = %x\n",crc32cx(crc,buff,len));
}
谁能帮我看看为什么这与在线 32 位 CRC 计算器不匹配。 Link 下面给出
对于输入 buff=12345678,我的 CRC 正在与在线的匹配。
对于 buff = ABCD1234 等其他值,输出不匹配。
谢谢。
这里的问题是代码的编写方式;让我解释一下:
unsigned int crc32cx(unsigned int crc,unsigned char *message,int len)
{
unsigned int word;
do
{
if((word = *(unsigned int *)message) & 0xFF)
{
crc = crc ^ word;
crc = (crc >> 8) ^ crc32_table[crc & 0xFF];
crc = (crc >> 8) ^ crc32_table[crc & 0xFF];
crc = (crc >> 8) ^ crc32_table[crc & 0xFF];
crc = (crc >> 8) ^ crc32_table[crc & 0xFF];
message = message + 4;
len--;
}
}while(len == 0);
return ~crc;
}
这个函数的作用是一次读取4个字符并计算CRC(异或运算); Wikipedia 解释了它背后的数学原理。
但是你做这个操作len次
unsigned char buff[100] = ABCDEFGH;
int len; // lenght in bytes
printf("crc = %x\n",crc32cx(crc,buff,4));
因此在您的情况下,您将读取 4x4 个字节;您的缓冲区将包含:
buff = ['A' 'B' 'C' 'D' 'E' 'F' 'G' 'H' '\n' 'trash' 'trash'.... ]
你有 8 个字节的信息,后跟一个 '\n' 因为你给缓冲区分配了一个字符串,而不是垃圾,因为缓冲区是在堆栈上分配的。你正在读取 16 个字节。
我相信您现在可以发现问题,但以防万一,我认为 crc32cx(crc,buff,2) 应该可以解决您的问题。
你的CRC码很不规范。在执行 table 方法时,您应该逐字节输入数据,而不是逐块输入数据,这肯定会导致一些输入和逻辑问题。最大的是这一行 if(word = *(unsigned int *)message) & 0xFF)
,这是完全不必要的,并且在某些情况下会忽略有效的传入数据。
一个漂亮、简单、干净的 crc32 C 实现可以是 seen here。在查看它和您的并进行一些调整后,它起作用了。
在您的函数中,您可以将循环和变量更改为:
unsigned char word;
do
{
word = *message;
crc = crc ^ word;
crc = (crc >> 8) ^ crc32_table[crc & 0xFF];
message++;
len--;
}while(len > 0);
现在在您的 main 中,您只需使用 len = strlen(buff)
.
即可找到输入数据的长度
谁能帮我计算 32 位 CRC。
这是我用于 32 位 CRC 计算的代码片段。
static unsigned int crc32_table[256];
void make_crc_table()
{
int j;
unsigned int crc,byte, mask;
/* Set up the table, if necessary. */
if (crc32_table[1] == 0)
{
for (byte = 0; byte <= 255; byte++)
{
crc = byte;
for (j = 7; j >= 0; j--) // Do eight times
{
mask = -(crc & 1);
crc = (crc >> 1) ^ (0xEDB88320 & mask);
}
crc32_table[byte] = crc;
}
}
for (j=0;j<10;j++)
printf("crc32_table[%d] = %x\n",j,crc32_table[j]);
}
unsigned int crc32cx(unsigned int crc,unsigned char *message,int len)
{
unsigned int word;
do
{
if((word = *(unsigned int *)message) & 0xFF)
{
crc = crc ^ word;
crc = (crc >> 8) ^ crc32_table[crc & 0xFF];
crc = (crc >> 8) ^ crc32_table[crc & 0xFF];
crc = (crc >> 8) ^ crc32_table[crc & 0xFF];
crc = (crc >> 8) ^ crc32_table[crc & 0xFF];
message = message + 4;
len--;
}
}while(len == 0);
return ~crc;
}
main()
{
unsigned int crc = 0xFFFFFFFF;
unsigned char buff[100] = ABCDEFGH;
int len; // lenght in bytes
len = (((strlen(buff)%8)==0) ? (strlen(buff)/8) : ((strlen(buff)/8)+1));
printf("lenght in bytes %d\n",len);
make_crc_table();
printf("crc = %x\n",crc32cx(crc,buff,len));
}
谁能帮我看看为什么这与在线 32 位 CRC 计算器不匹配。 Link 下面给出
对于输入 buff=12345678,我的 CRC 正在与在线的匹配。 对于 buff = ABCD1234 等其他值,输出不匹配。
谢谢。
这里的问题是代码的编写方式;让我解释一下:
unsigned int crc32cx(unsigned int crc,unsigned char *message,int len)
{
unsigned int word;
do
{
if((word = *(unsigned int *)message) & 0xFF)
{
crc = crc ^ word;
crc = (crc >> 8) ^ crc32_table[crc & 0xFF];
crc = (crc >> 8) ^ crc32_table[crc & 0xFF];
crc = (crc >> 8) ^ crc32_table[crc & 0xFF];
crc = (crc >> 8) ^ crc32_table[crc & 0xFF];
message = message + 4;
len--;
}
}while(len == 0);
return ~crc;
}
这个函数的作用是一次读取4个字符并计算CRC(异或运算); Wikipedia 解释了它背后的数学原理。 但是你做这个操作len次
unsigned char buff[100] = ABCDEFGH;
int len; // lenght in bytes
printf("crc = %x\n",crc32cx(crc,buff,4));
因此在您的情况下,您将读取 4x4 个字节;您的缓冲区将包含:
buff = ['A' 'B' 'C' 'D' 'E' 'F' 'G' 'H' '\n' 'trash' 'trash'.... ]
你有 8 个字节的信息,后跟一个 '\n' 因为你给缓冲区分配了一个字符串,而不是垃圾,因为缓冲区是在堆栈上分配的。你正在读取 16 个字节。 我相信您现在可以发现问题,但以防万一,我认为 crc32cx(crc,buff,2) 应该可以解决您的问题。
你的CRC码很不规范。在执行 table 方法时,您应该逐字节输入数据,而不是逐块输入数据,这肯定会导致一些输入和逻辑问题。最大的是这一行 if(word = *(unsigned int *)message) & 0xFF)
,这是完全不必要的,并且在某些情况下会忽略有效的传入数据。
一个漂亮、简单、干净的 crc32 C 实现可以是 seen here。在查看它和您的并进行一些调整后,它起作用了。
在您的函数中,您可以将循环和变量更改为:
unsigned char word;
do
{
word = *message;
crc = crc ^ word;
crc = (crc >> 8) ^ crc32_table[crc & 0xFF];
message++;
len--;
}while(len > 0);
现在在您的 main 中,您只需使用 len = strlen(buff)
.