为了提高编码效率,在实际运用中大多采用查表法来完成CRC-32校验,下面是产生CRC-32校验吗的子程序。
unsigned long crc_32_tab[256]={
0x00000000, 0x77073096, 0xee0e612c, 0x990951ba, 0x076dc419, 0x706af48f, 0xe963a535, 0x9e6495a3,0x0edb8832,…, 0x5a05df1b, 0x2d02ef8d
};//事先计算出的参数表,共有256项,未全部列出。
unsigned long GenerateCRC32(char xdata * DataBuf,unsigned long len)
{
unsigned long oldcrc32;
unsigned long crc32;
unsigned long oldcrc;
unsigned int charcnt;
char c,t;
oldcrc32 = 0x00000000; //初值为0
charcnt=0;
while (len--) {
t= (oldcrc32 >> 24) & 0xFF; //要移出的字节的值--〉不明白,为什么这么做就能得出要移出的字节的值? oldcrc=crc_32_tab[t]; //根据移出的字节的值查表
c=DataBuf[charcnt]; //新移进来的字节值
oldcrc32= (oldcrc32 << 8) | c; //将新移进来的字节值添在寄存器末字节中
oldcrc32=oldcrc32^oldcrc; //将寄存器与查出的值进行xor运算
charcnt++;
}
crc32=oldcrc32;
return crc32;
}红色部分就是我的疑问,请大虾们给小弟解惑啊。谢谢了
unsigned long crc_32_tab[256]={
0x00000000, 0x77073096, 0xee0e612c, 0x990951ba, 0x076dc419, 0x706af48f, 0xe963a535, 0x9e6495a3,0x0edb8832,…, 0x5a05df1b, 0x2d02ef8d
};//事先计算出的参数表,共有256项,未全部列出。
unsigned long GenerateCRC32(char xdata * DataBuf,unsigned long len)
{
unsigned long oldcrc32;
unsigned long crc32;
unsigned long oldcrc;
unsigned int charcnt;
char c,t;
oldcrc32 = 0x00000000; //初值为0
charcnt=0;
while (len--) {
t= (oldcrc32 >> 24) & 0xFF; //要移出的字节的值--〉不明白,为什么这么做就能得出要移出的字节的值? oldcrc=crc_32_tab[t]; //根据移出的字节的值查表
c=DataBuf[charcnt]; //新移进来的字节值
oldcrc32= (oldcrc32 << 8) | c; //将新移进来的字节值添在寄存器末字节中
oldcrc32=oldcrc32^oldcrc; //将寄存器与查出的值进行xor运算
charcnt++;
}
crc32=oldcrc32;
return crc32;
}红色部分就是我的疑问,请大虾们给小弟解惑啊。谢谢了
解决方案 »
- QT 图片缩放 读取问题
- vs2010工程可以转换vc6.0吗?
- VC2005 在状态栏上添加按钮以后,按钮无法响应左键点击消息
- isqlw 执行脚本文件成功后,进程如何能自己退出,急!!!!
- 如何用重载窗体的OnNotify方法去捕获按钮的单击事件
- 一个学期设计任务(学生信息管理系统)正在学习的可以来试试
- OpenGL是否支持双屏显示????????
- 哪儿有TeeChart-Pro Activex 5正版(解密版)控件下载?
- 请教,TCP/IP的底层编程问题?
- 我有个VHDL的教程的文件,可是格式为.vcd,有282M,怎么打开呢?
- int nSizeRequired = (m_Bih.biWidth * 24 + 31) / 32 * 4 * m_Bih.biHeight;是什么意思?
- 如何在mfc应用中调用C#写的dll
这里要取oldcrc32的最高字节,将oldcrc32右移24位,也就是取最高字节
所以t赋值成oldcrc32的最高字节
http://blog.csdn.net/DavidHsing/archive/2009/05/14/4184240.aspx