1.输入数据crcdword移动,菜农喜欢的方法,它实际与i的位置无关 function crc32l(crcdword) { var i,temp; for(i = 0; i < 32; i++){ temp = crcvalue ^ crcdword;//记录方向端点(D31) crcvalue <<= 1;//前面已记录,此时不管三七二十一左移1次 crcdword <<= 1;//此句可以在以下任何地方~~~ if(temp & 0x80000000) {//方向端点跳变,需要变换,实际“左环移” crcvalue ^= crcval;//0x04C11DB7,注意D0肯定为1~~~ } // crcdword <<= 1;//上面的写法可以看出它实际和crcvalue一起移动的。 } }
2.输入数据crcdword不移动,这估计是大多数人想到的~~~ 从上例可以看出,crcvalue和crcdword是一同移动的~~~ 它永远记录方向端点(D31),故和位置i无关 这样就可以动态跟踪位置i的跳变
function crc32l(crcdword) { var i,temp; temp = crcvalue;//暂存CRC,应为它必须移动,但temp可以不移动 for(i = 31; i >= 0; i--){ crcvalue <<= 1;//不管三七二十一左移1次 //下面(1 << i)实际可以用xbit= 1<< 31;然后xbit>>=1,这里主要表现与位置i有关 if((temp ^ crcdword) & (1 << i)) {//判断记录方向可变端点(D31~D0) crcvalue ^= crcval;//0x04C11DB7,注意D0肯定为1~~~ } } }
可以看出例2在硬件上实现比例1难度增加,假若硬件是33位,那么程序可简化为:
function crc32l(crcdword) { var i;//省去temp;//i实际是32个脉冲时钟 for(i = 32; i > 0; i--){//33位计数器,倒数肯定简单(与0比较) crcvalue <<= 1;//不管三七二十一左移1次,因为是33位的寄存器~~~ crcdword <<= 1;//不管三七二十一左移1次,因为是33位的寄存器~~~ if((crcvalue ^ crcdword) >= 0x100000000) {//记录方向端点(D32),硬件只需检测D32即可 crcvalue ^= crcval;//0x04C11DB7,注意D0肯定为1~~~ } } }//出口是32位的CRC结果crcvalue,D32不输出,只输出D31~D0 相关链接:http://www.hotpower.org/HotPower_CRC.html
|