Chinaunix首页 | 论坛 | 博客
  • 博客访问: 157233
  • 博文数量: 33
  • 博客积分: 2057
  • 博客等级: 大尉
  • 技术积分: 430
  • 用 户 组: 普通用户
  • 注册时间: 2007-11-19 16:37
文章分类
文章存档

2013年(2)

2012年(23)

2011年(8)

分类: Python/Ruby

2012-10-21 15:57:51


点击(此处)折叠或打开

  1. def crc(c,g):
  2.     cc = bin(c)[2:]
  3.     gg = bin(g)[2:]
  4.     x = len(gg)
  5.     a=int(cc[:x],2)
  6.    
  7.     while x<len(cc):
  8.         r = a^g
  9.         rr = bin(r)[2:]
  10.         w = len(gg)-len(rr)
  11.         a = int(rr+cc[x:x+w],2)
  12.         x = x+w
  13.         print bin(a)
  14.     if len(bin(a))<len(bin(g)):
  15.         print bin(a),hex(a)
  16.     else:
  17.         print bin(a^g),hex(a^g)

点击(此处)折叠或打开

  1. #coding:utf-8

  2. ##http://zhidao.baidu.com/question/266312731.html
  3. ##CRC码的计算方法是:
  4. ##1、 预置1个16位的寄存器为十六进制FFFF(即全为1);称此寄存器为CRC寄存器;
  5. ##2、 把第一个8位二进制数据(既通讯信息帧的第一个字节)与16位的CRC寄存器的低8位相异或,把结果放于CRC寄存器;
  6. ##3、 把CRC寄存器的内容右移一位(朝低位)用0填补最高位,并检查移出位;
  7. ##4、 如果移出位为0:重复第3步(再次右移一位); 如果移出位为1:CRC寄存器与多项式A001(1010 0000 0000 0001)进行异或;
  8. ##5、 重复步骤3和4,直到右移8次,这样整个8位数据全部进行了处理;
  9. ##6、 重复步骤2到步骤5,进行通讯信息帧下一个字节的处理;
  10. ##7、 将该通讯信息帧所有字节按上述步骤计算完成后,得到的16位CRC寄存器;
  11. ##8、 最后得到的CRC寄存器的高、低字节进行交换即为:CRC码。
  12. ##
  13. ##

  14. def crc16(x):
  15.     b = 0xA001
  16.     a = 0xFFFF
  17.     for byte in x:
  18.         a = a^byte
  19.         for i in range(8):
  20.             last = a%2
  21.             a = a>>1
  22.             if last ==1: a = a^b
  23.     aa = '0'*(6-len(hex(a)))+hex(a)[2:]
  24.     ll,hh = int(aa[:2],16),int(aa[2:],16)
  25.     #print hex(hh),hex(ll)
  26.     return [hh,ll]

阅读(3885) | 评论(0) | 转发(0) |
给主人留下些什么吧!~~