为什么我写的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
我到底哪里错了?
帮我解决一下喂,先谢谢了 展开
#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
我到底哪里错了?
帮我解决一下喂,先谢谢了 展开
1个回答
展开全部
你不一定错, 你们采用的标准不同,从你的代码看采用的是CRC-32-IEEE 802.3标准,取值为0x04C11DB7,0xEDB88320 (0xDB710641)中的0xEDB88320,你可以可能看你们用的循环冗余校验多项式值相同不,还有一种Castagnoli校验算法优化,也属于32为循环冗余校验,多项式值为0x1EDC6F41,0x82F63B78 (0x05EC76F1)。
更多追问追答
追问
请问一下,winRAR他使用的是标准呢?
追答
winRAR没测过,你可以将你程序中的0xEDB88320改成别的两个看看,我手头有CB和C#和C++的代码,都是网上下的,CB和C#的我测试过,都没问题,C++的没测过。
推荐律师服务:
若未解决您的问题,请您详细描述您的问题,通过百度律临进行免费专业咨询