1. 程式人生 > >python進行crc校驗的方法小感

python進行crc校驗的方法小感

import serial
import re
import time
'''
讀卡器操作類:
 
    
'''
class reader():
    baud_rate = 115200
    device_name = ''
    timeout = 1
    ser = None


    @staticmethod
    def opencom(device_name):
        try:
            reader.ser = serial.Serial(reader.device_name,reader.baud_rate,timeout = reader.timeout)
            return True
        except Exception, e:
            return False


    @staticmethod
    def com_detect():
        reader.device_name = '/dev/ttyUSB0'
        if reader.opencom(reader.device_name):
            return True
        else:
            reader.device_name = '/dev/ttyUSB1'
            if reader.opencom(reader.device_name):
                return True 
            else:
                reader.device_name = '/dev/ttyUSB2'
                if reader.opencom(reader.device_name):
                    return True 
                else:
                    reader.device_name = 'COM2'
                    if reader.opencom(reader.device_name):
                        return True 
                    else:
                        return False

    
    @staticmethod
    def _crc1(data = '0001020304050607080900102030405060708090'):
        datalist = re.findall(r'(.{2})',data) 
        crcnum = 0
        for i in datalist:
            try:
                num = int(i,16)
                crcnum = crcnum ^ num
            except Exception, e:
                return 'error of change2int '
        crcstr = format(crcnum,'x')
        return crcstr


    @staticmethod
    def _crc2(data = '0001020304050607080900102030405060708090'):
        num = (len(data)+1)/2 
        crcnum = 0 
        for i in range(num):
            try:
                num = int(data[:2],16)
                crcnum = crcnum ^ num
                data = data[2:]
            except Exception, e:
                return 'error of change2int '
        crcstr = format(crcnum,'x')
        return crcstr


    @staticmethod
    def _crc3(data = '0001020304050607080900102030405060708090'):
        num = (len(data)+1)/2
        datalist = []
        for i in range(num):
            string = data[(0+i*2):(2+i*2)]
            datalist.append(string)
        crcnum = 0 
        for i in datalist:
            try:
                num = int(i,16)
                crcnum = crcnum ^ num
            except Exception, e:
                return 'error of change2int '
        crcstr = format(crcnum,'x')
        return crcstr









if __name__ == '__main__':
    if reader.com_detect():
        a = 0
        for i in range(1000):
            start = time.clock()
            for i in range(100):
                reader._crc1()
            end = time.clock()
            a = a + end - start
        print a


        a = 0
        for i in range(1000):
            start = time.clock()
            for i in range(100):
                reader._crc2()
            end = time.clock()
            a = a + end - start
        print a


        a = 0
        for i in range(1000):
            start = time.clock()
            for i in range(100):
                reader._crc3()
            end = time.clock()
            a = a + end - start
        print a
    else:

        print 'no com found'

輸出的時間:crc1:1.76726367849
                        crc2:1.41187894711
                        crc3:1.80825700785

第一種方法快於第三種慢於第二種