python进行crc校验的方法小感

发布时间:2019-08-16 10:28:34编辑:auto阅读(2465)

    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

    第一种方法快于第三种慢于第二种

关键字