CRC16IBM(A001)的16字表长查表程序

[复制链接]
3747|6
 楼主| hotpower 发表于 2009-10-18 17:01 | 显示全部楼层 |阅读模式
本帖最后由 hotpower 于 2009-10-18 19:10 编辑

此文依据: http://blog.**/hotpower/272834/message.aspx
CRC位域4单表查表及建表原则:
左移位域4取列表16个,大端存储模式。右移位域4取行表16个,小端存储模式。
在CRC-16-IBM中CRC的多项式为:右移CRC16=X16+X15+X2+1,即权值=0xA001,故建立16字节的CRC表格:
(参见:http://zh.wikipedia.org/zh-cn/%E5%BE%AA%E7%8E%AF%E5%86%97%E4%BD%99%E6%A0%A1%E9%AA%8C)
网上CRC16的256个表为:
unsigned int CRC16Table[256] = {                                 
   0x0000, 0xC0C1, 0xC181, 0x0140, 0xC301, 0x03C0, 0x0280, 0xC241,   
   0xC601, 0x06C0, 0x0780, 0xC741, 0x0500, 0xC5C1, 0xC481, 0x0440,   
   0xCC01, 0x0CC0, 0x0D80, 0xCD41, 0x0F00, 0xCFC1, 0xCE81, 0x0E40,   
   0x0A00, 0xCAC1, 0xCB81, 0x0B40, 0xC901, 0x09C0, 0x0880, 0xC841,   
   0xD801, 0x18C0, 0x1980, 0xD941, 0x1B00, 0xDBC1, 0xDA81, 0x1A40,   
   0x1E00, 0xDEC1, 0xDF81, 0x1F40, 0xDD01, 0x1DC0, 0x1C80, 0xDC41,   
   0x1400, 0xD4C1, 0xD581, 0x1540, 0xD701, 0x17C0, 0x1680, 0xD641,   
   0xD201, 0x12C0, 0x1380, 0xD341, 0x1100, 0xD1C1, 0xD081, 0x1040,   
   0xF001, 0x30C0, 0x3180, 0xF141, 0x3300, 0xF3C1, 0xF281, 0x3240,   
   0x3600, 0xF6C1, 0xF781, 0x3740, 0xF501, 0x35C0, 0x3480, 0xF441,   
   0x3C00, 0xFCC1, 0xFD81, 0x3D40, 0xFF01, 0x3FC0, 0x3E80, 0xFE41,   
   0xFA01, 0x3AC0, 0x3B80, 0xFB41, 0x3900, 0xF9C1, 0xF881, 0x3840,   
   0x2800, 0xE8C1, 0xE981, 0x2940, 0xEB01, 0x2BC0, 0x2A80, 0xEA41,   
   0xEE01, 0x2EC0, 0x2F80, 0xEF41, 0x2D00, 0xEDC1, 0xEC81, 0x2C40,   
   0xE401, 0x24C0, 0x2580, 0xE541, 0x2700, 0xE7C1, 0xE681, 0x2640,   
   0x2200, 0xE2C1, 0xE381, 0x2340, 0xE101, 0x21C0, 0x2080, 0xE041,   
   0xA001, 0x60C0, 0x6180, 0xA141, 0x6300, 0xA3C1, 0xA281, 0x6240,//注意本行的0xA001   
   0x6600, 0xA6C1, 0xA781, 0x6740, 0xA501, 0x65C0, 0x6480, 0xA441,   
   0x6C00, 0xACC1, 0xAD81, 0x6D40, 0xAF01, 0x6FC0, 0x6E80, 0xAE41,   
   0xAA01, 0x6AC0, 0x6B80, 0xAB41, 0x6900, 0xA9C1, 0xA881, 0x6840,   
   0x7800, 0xB8C1, 0xB981, 0x7940, 0xBB01, 0x7BC0, 0x7A80, 0xBA41,   
   0xBE01, 0x7EC0, 0x7F80, 0xBF41, 0x7D00, 0xBDC1, 0xBC81, 0x7C40,   
   0xB401, 0x74C0, 0x7580, 0xB541, 0x7700, 0xB7C1, 0xB681, 0x7640,   
   0x7200, 0xB2C1, 0xB381, 0x7340, 0xB101, 0x71C0, 0x7080, 0xB041,   
   0x5000, 0x90C1, 0x9181, 0x5140, 0x9301, 0x53C0, 0x5280, 0x9241,   
   0x9601, 0x56C0, 0x5780, 0x9741, 0x5500, 0x95C1, 0x9481, 0x5440,   
   0x9C01, 0x5CC0, 0x5D80, 0x9D41, 0x5F00, 0x9FC1, 0x9E81, 0x5E40,   
   0x5A00, 0x9AC1, 0x9B81, 0x5B40, 0x9901, 0x59C0, 0x5880, 0x9841,   
   0x8801, 0x48C0, 0x4980, 0x8941, 0x4B00, 0x8BC1, 0x8A81, 0x4A40,   
   0x4E00, 0x8EC1, 0x8F81, 0x4F40, 0x8D01, 0x4DC0, 0x4C80, 0x8C41,   
   0x4400, 0x84C1, 0x8581, 0x4540, 0x8701, 0x47C0, 0x4680, 0x8641,   
   0x8201, 0x42C0, 0x4380, 0x8341, 0x4100, 0x81C1, 0x8081, 0x4040
};
即CRC位域8表:
CRC16Table[256]={CRC[0x0000],CRC[0x0100],CRC[0x0200],...CRC[0xFD00],CRC[0xFE00],CRC[0xFF00]};

特别注意对CRC表逆向出权值的方法(256表):
右移方式,CRC多项式即权值=CRC16Table[0x80]=0xA001
左移方式,CRC多项式即权值=CRC16Table[0x01]
本文采用CRC位域4查表方式,故表为:
CRC16Table[16]={CRC[0x0000],CRC[0x1000],CRC[0x2000],...CRC[0xD000],CRC[0xE000],CRC[0xF000]};
即右移方式取行表:
CRC16Table[16]={
  0x0000,0xCC01,0xD801,0x1400,0xF001,0x3C00,0x2800,0xE401,
  0xA001,0x6C00,0x7800,0xB401,0x5000,0x9C01,0x8801,0x4400//注意本行的0xA001
};
unsigned int GetCRC16(unsigned int crcinit, unsigned int crcval)
{//(可以不要初值crcinit,多字节CRC16时入口需要对crcval做处理)
unsigned int i, crc=0;
  crcval = crcinit ^ crcval;
  for(i = 0;i < 4;i ++)//2个字节位域4需要4次完成
  {
    crc = (crc >> 4) ^ CRC16Table[(crc ^ crcval) & 0x0F];//位域宽4单表16个字节
    crcval >>= 4;//准备下一个位域,域宽4
  }
  return crc;
}

菜农HotPower@126.com  2009.10.18 于雁塔菜地
老狼 发表于 2009-10-18 17:02 | 显示全部楼层
你终于露面了,老哥哥!
 楼主| hotpower 发表于 2009-10-18 18:29 | 显示全部楼层
哈哈~~~冒个泡泡~~~
bhsdlmj 发表于 2009-10-18 18:34 | 显示全部楼层
太好了!!!!非常有用啊!!!



请再写一个大小端和 字节对齐的专题吧
xwj 发表于 2009-10-18 18:39 | 显示全部楼层
 楼主| hotpower 发表于 2011-12-26 13:14 | 显示全部楼层
顶起来,掀起密码安全教育风暴~~~
 楼主| hotpower 发表于 2012-10-23 18:54 | 显示全部楼层
挖墓为2012.10.25菜农个人版《HotWC3密码体系》开版搜索
您需要登录后才可以回帖 登录 | 注册

本版积分规则

1460

主题

21617

帖子

508

粉丝
快速回复 在线客服 返回列表 返回顶部