zoukankan      html  css  js  c++  java
  • 字符串CRC校验

    字符串CRC校验

    [python] view plain copy
     
    1. <pre name="code" class="python"><span style="font-family: Arial, Helvetica, sans-serif; background-color: rgb(255, 255, 255);">参考网址http://blog.163.com/du_minchao@126/blog/static/107495394201075114028606/</span>  
    
    
    

    上边参考网址内的计算方法亲自算一遍就知道CRC怎么使用了(就是上边的图片),搜索了一下,大部分都是C语言实现,工作期间需要用Python实现求字符串CRC校验的函数,使用查表法实现

    #!/usr/bin/env python
    # -*- coding: utf-8 -*-
    
    
    POLYNOMIAL = 0x1021
    INITIAL_REMAINDER = 0xFFFF
    FINAL_XOR_VALUE = 0x0000
    WIDTH = 16
    TOPBIT = (1 << (WIDTH - 1))
    crcTable = {}
    
    def crcInit():
        SHIFT = WIDTH - 8
        for step in range(0, 256):
            remainder = step << SHIFT
            for bit in range(8, 0, -1):
                if remainder & TOPBIT:
                    remainder = ((remainder << 1) & 0xFFFF) ^ 0x1021
                else:
                    remainder = remainder << 1
            crcTable[step] = remainder
    
    def crcFast(message, nBytes):
        crcInit()
        remainder = 0xFFFF
        data = 0
        byte = 0
        while byte < nBytes:
            data = ord(message[byte]) ^ (remainder >> (WIDTH - 8))
            remainder = crcTable[data] ^ ((remainder << 8)&0xFFFF)
            byte = byte + 1
            
        return hex(remainder)[2: ]

     
     


    位移时要注意 python的整数没有最大值,而C++中不同,左移会将高位移掉,python则一直保留高位,所以通过位0xFFFF与的方式将高位去掉。

  • 相关阅读:
    逆元(费马小定理求法)
    CodeForces
    lower_bound and upper_bound
    HDU 4825 Xor Sum
    1030: [JSOI2007]文本生成器
    1070: [SCOI2007]修车
    agc 027 B
    P2664 树上游戏
    CF 314 E. Sereja and Squares
    4237: 稻草人
  • 原文地址:https://www.cnblogs.com/liangqihui/p/8522968.html
Copyright © 2011-2022 走看看