为什么我写的CRC32验证和压缩包的CRC32值不一样?哪位大神能帮解答一下啊

#include<stdio.h>#include<Windows.h>#defineBUFFERSIZE4*1024#define_FileName_"F:\\123.... #include <stdio.h>
#include <Windows.h>

#define BUFFERSIZE 4*1024
#define _FileName_ "F:\\123.txt"

static int CRC32_table[256];
void POLY_CRC32(void);
void compare_crc(char * filename);
unsigned int Mark_CRC32(unsigned int crc,unsigned char *string,unsigned int iSize);

void POLY_CRC32(void)
{
unsigned int crc;
for (unsigned int i=0;i<256;i++)
{
crc = i;
for (int j=0;j<8;j++)
{
if(crc & 1)
crc = (crc >> 1) ^ 0xEDB88320;
else
crc >>= 1;
}
CRC32_table[i] = crc;
}
}

unsigned int Mark_CRC32(unsigned int crc,unsigned char *string,unsigned int iSize)
{
while (iSize--)
crc = (crc >> 8) ^ CRC32_table[(crc ^ *string++) & 0xff];
return crc;
}

void compare_crc(char * filename)
{
unsigned char buf[BUFFERSIZE];
FILE* fd = NULL;
size_t count;
unsigned int crc32 = 0xffffffff;

if(filename == NULL)
{
printf("没有文件名称!\n");
return;
}
if (fopen_s(&fd,filename,"r") != 0)
{
printf("打开文件失败!\n");
return;
}
while (!feof(fd))
{
memset(buf,0,sizeof(buf));
count = fread(buf,sizeof(char),sizeof(buf),fd);
crc32 = Mark_CRC32(crc32,buf,count);
}
fclose(fd);
printf("%x\n",crc32);
}

int main()
{
POLY_CRC32();

compare_crc(_FileName_);

getchar();
return 0;
}

这个是我自己写的,得出来的结果是0x20081243
但是我用winRAR的时候看见的是0x0E94231B
我到底哪里错了?

帮我解决一下喂,先谢谢了
展开
 我来答
方衍晴茶话会
2013-07-28 · TA获得超过157个赞
知道小有建树答主
回答量:152
采纳率:0%
帮助的人:123万
展开全部
你不一定错, 你们采用的标准不同,从你的代码看采用的是CRC-32-IEEE 802.3标准,取值为0x04C11DB7,0xEDB88320 (0xDB710641)中的0xEDB88320,你可以可能看你们用的循环冗余校验多项式值相同不,还有一种Castagnoli校验算法优化,也属于32为循环冗余校验,多项式值为0x1EDC6F41,0x82F63B78 (0x05EC76F1)。
更多追问追答
追问
请问一下,winRAR他使用的是标准呢?
追答
winRAR没测过,你可以将你程序中的0xEDB88320改成别的两个看看,我手头有CB和C#和C++的代码,都是网上下的,CB和C#的我测试过,都没问题,C++的没测过。
推荐律师服务: 若未解决您的问题,请您详细描述您的问题,通过百度律临进行免费专业咨询

为你推荐:

下载百度知道APP,抢鲜体验
使用百度知道APP,立即抢鲜体验。你的手机镜头里或许有别人想知道的答案。
扫描二维码下载
×

类别

我们会通过消息、邮箱等方式尽快将举报结果通知您。

说明

0/200

提交
取消

辅 助

模 式