python进行crc校验的方法

  • 2020 年 1 月 12 日
  • 筆記

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

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