Python里面的进制转换

Python中变量是无类型的,但是变量可以指向某一个内存区域,该区域的类型就是变量的类型,Python在给一个变量赋值的时候才能确定该变量的类型,可以理解为Python有一个变量表,当给变量赋值的时候,相当于在内存中分配了一个存储区域,然后在变量表里添加了该变量,并将该变量指向分配的内存区域。

Python的这个特性决定了其动态类型的特征,在理解的时候要区分于C、C#等编程语言。

Python里的进制转换

Python在处理字节串时候的困难

以前用C语言写过一些单片机的串口程序,通信一般用的是字节串,这次想用Python实现一个基于TCP的104协议,实际编写中才发现Python为了方便使用,数据类型int并未固定长度,也无法将其设置为8个比特位长度。甚至无法利用十六进制(0xAA)之类的给变量赋值。也就是说不管是变量还是表达式,Python根本无法表示一个字节的数值。

Python里的解决办法

好在Python里可以通过bytes()函数获得一个字节串,这就表示我们找到一个可以装一个字节的变量,但是依然无法利用一个变量或表达式给其赋值,只可以通过bytes()函数返回。值得注意的是,bytes()函数如果给他一个整数,并不会返回该整数的字节,只会返回一个长度为该整数的字节串。
Python代码:

>>> bytes(10)
b'\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00'
>>> 

如果要想返回一个数值为10 的字节,需要给一个可迭代的对象(list)
Python代码:

>>> bytes([12])
b'\x0c'
>>> 

同样,通过通信口接收的字节串也可以转换为list类型
Python代码:

>>> list(b"12")
[49, 50]
>>> 

“12”默认是字符,转换过来就是49,50,不过不用担心,从通信口过来的数据肯定是真正的字节串。这个不影响。
走到这一步还不行,因为在一般的报文识别中,都是利用十六进制来进行识别的,如果我们用Python内置的进制转换函数会发现:

>>> hex(10)
'0xa'
>>> 
>>> hex(16)
'0x10'
>>> 

这里的转换结果是一个字符串,并且在16以下,转换出来的是0xa,并不是0x0a,这在后续的报文识别中是个麻烦,所以自己编写了一个工具类,专门用来做10到16进制的转换。

>>> Change.changets(10)
'0A'
>>> Change.change_list_ts([1,2,3,4,5,6])
['01', '02', '03', '04', '05', '06']
>>> Change.changest("0A")
10
>>> Change.change_list_st(["01","02","03"])
[1, 2, 3]
>>> 

转换过来的十六进制仍然是字符串,这个没法改变。
以下是Change类的源码:

class Change:

     ten_sit={0: '00', 1: '01', 2: '02', 3: '03', 4: '04', 5: '05',
             6: '06', 7: '07', 8: '08', 9: '09', 10: '0A', 11: '0B',
             12: '0C', 13: '0D', 14: '0E', 15: '0F', 16: '10', 17: '11',
             18: '12', 19: '13', 20: '14', 21: '15', 22: '16', 23: '17',
             24: '18', 25: '19', 26: '1A', 27: '1B', 28: '1C', 29: '1D',
             30: '1E', 31: '1F', 32: '20', 33: '21', 34: '22', 35: '23',
             36: '24', 37: '25', 38: '26', 39: '27', 40: '28', 41: '29',
             42: '2A', 43: '2B', 44: '2C', 45: '2D', 46: '2E', 47: '2F',
             48: '30', 49: '31', 50: '32', 51: '33', 52: '34', 53: '35',
             54: '36', 55: '37', 56: '38', 57: '39', 58: '3A', 59: '3B',
             60: '3C', 61: '3D', 62: '3E', 63: '3F', 64: '40', 65: '41',
             66: '42', 67: '43', 68: '44', 69: '45', 70: '46', 71: '47',
             72: '48', 73: '49', 74: '4A', 75: '4B', 76: '4C', 77: '4D',
             78: '4E', 79: '4F', 80: '50', 81: '51', 82: '52', 83: '53',
             84: '54', 85: '55', 86: '56', 87: '57', 88: '58', 89: '59',
             90: '5A', 91: '5B', 92: '5C', 93: '5D', 94: '5E', 95: '5F',
             96: '60', 97: '61', 98: '62', 99: '63', 100: '64', 101: '65',
             102: '66', 103: '67', 104: '68', 105: '69', 106: '6A', 107: '6B',
             108: '6C', 109: '6D', 110: '6E', 111: '6F', 112: '70', 113: '71',
             114: '72', 115: '73', 116: '74', 117: '75', 118: '76', 119: '77',
             120: '78', 121: '79', 122: '7A', 123: '7B', 124: '7C', 125: '7D',
             126: '7E', 127: '7F', 128: '80', 129: '81', 130: '82', 131: '83',
             132: '84', 133: '85', 134: '86', 135: '87', 136: '88', 137: '89',
             138: '8A', 139: '8B', 140: '8C', 141: '8D', 142: '8E', 143: '8F',
             144: '90', 145: '91', 146: '92', 147: '93', 148: '94', 149: '95',
             150: '96', 151: '97', 152: '98', 153: '99', 154: '9A', 155: '9B',
             156: '9C', 157: '9D', 158: '9E', 159: '9F', 160: 'A0', 161: 'A1',
             162: 'A2', 163: 'A3', 164: 'A4', 165: 'A5', 166: 'A6', 167: 'A7',
             168: 'A8', 169: 'A9', 170: 'AA', 171: 'AB', 172: 'AC', 173: 'AD',
             174: 'AE', 175: 'AF', 176: 'B0', 177: 'B1', 178: 'B2', 179: 'B3',
             180: 'B4', 181: 'B5', 182: 'B6', 183: 'B7', 184: 'B8', 185: 'B9',
             186: 'BA', 187: 'BB', 188: 'BC', 189: 'BD', 190: 'BE', 191: 'BF',
             192: 'C0', 193: 'C1', 194: 'C2', 195: 'C3', 196: 'C4', 197: 'C5',
             198: 'C6', 199: 'C7', 200: 'C8', 201: 'C9', 202: 'CA', 203: 'CB',
             204: 'CC', 205: 'CD', 206: 'CE', 207: 'CF', 208: 'D0', 209: 'D1',
             210: 'D2', 211: 'D3', 212: 'D4', 213: 'D5', 214: 'D6', 215: 'D7',
             216: 'D8', 217: 'D9', 218: 'DA', 219: 'DB', 220: 'DC', 221: 'DD',
             222: 'DE', 223: 'DF', 224: 'E0', 225: 'E1', 226: 'E2', 227: 'E3',
             228: 'E4', 229: 'E5', 230: 'E6', 231: 'E7', 232: 'E8', 233: 'E9',
             234: 'EA', 235: 'EB', 236: 'EC', 237: 'ED', 238: 'EE', 239: 'EF',
             240: 'F0', 241: 'F1', 242: 'F2', 243: 'F3', 244: 'F4', 245: 'F5',
             246: 'F6', 247: 'F7', 248: 'F8', 249: 'F9', 250: 'FA', 251: 'FB',
             252: 'FC', 253: 'FD', 254: 'FE'}
     sit_ten={'ED': 237, 'E7': 231, '38': 56, '78': 120, '16': 22, 'B2': 178,
             'BA': 186, '63': 99, 'D0': 208, 'FA': 250, '9A': 154, '91': 145,
             'A5': 165, 'F5': 245, '0E': 14, '15': 21, 'DB': 219, '74': 116,
             '4F': 79, '4C': 76, 'BC': 188, '12': 18, '6F': 111, '44': 68,
             '67': 103, '49': 73, 'FC': 252, '35': 53, 'A3': 163, '00': 0,
             'EE': 238, '7A': 122, 'AE': 174, 'B1': 177, '85': 133, '8F': 143,
             '8C': 140, '0A': 10, '61': 97, '86': 134, '14': 20, 'D7': 215,
             '3A': 58, '05': 5, '73': 115, '1B': 27, '22': 34, '52': 82,
             'A9': 169, '2C': 44, 'BB': 187, 'FE': 254, 'BD': 189, '31': 49,
             '51': 81, 'BE': 190, '65': 101, '13': 19, '9D': 157, 'F3': 243,
             '6B': 107, '37': 55, '27': 39, 'EA': 234, 'DA': 218, '53': 83,
             '62': 98, '6E': 110, '20': 32, 'B9': 185, 'D5': 213, '5C': 92,
             '11': 17, 'E5': 229, 'E8': 232, 'E0': 224, 'C2': 194, 'D1': 209,
             'A4': 164, '39': 57, '71': 113, 'C8': 200, 'B3': 179, '07': 7,
             '5A': 90, '95': 149, '23': 35, 'C1': 193, '34': 52, '41': 65,
             'F1': 241, '87': 135, '72': 114, '77': 119, 'F4': 244, '43': 67,
             '02': 2, '36': 54, '84': 132, '83': 131, 'F8': 248, '96': 150,
             '5F': 95, '97': 151, 'C7': 199, 'D8': 216, '18': 24, 'F0': 240,
             '98': 152, 'CF': 207, 'EC': 236, '29': 41, '25': 37, 'AF': 175,
             '32': 50, 'CC': 204, '93': 147, '57': 87, '79': 121, '1E': 30,
             '3B': 59, 'EF': 239, 'DD': 221, 'AC': 172, '4D': 77, '01': 1,
             '3E': 62, '47': 71, '3F': 63, '9B': 155, 'C5': 197, '60': 96,
             '21': 33, 'E3': 227, 'B7': 183, '19': 25, '0B': 11, '10': 16,
             'FD': 253, '30': 48, '5D': 93, '7B': 123, 'CA': 202, 'A1': 161,
             '4A': 74, '24': 36, '9C': 156, 'CE': 206, 'EB': 235, '56': 86,
             '99': 153, '4B': 75, '6C': 108, '75': 117, '42': 66, 'B5': 181,
             '82': 130, 'E2': 226, 'DC': 220, '8E': 142, '8D': 141, '58': 88,
             '55': 85, '80': 128, 'C3': 195, '9F': 159, '06': 6, 'B4': 180,
             'F7': 247, '5E': 94, 'DE': 222, '7D': 125, 'AA': 170, 'FB': 251,
             'E4': 228, '6D': 109, '69': 105, 'F6': 246, '68': 104, '45': 69,
             'CB': 203, 'A0': 160, 'A7': 167, '6A': 106, 'B6': 182, '1F': 31,
             '59': 89, '76': 118, 'AD': 173, '70': 112, '8A': 138, 'B0': 176,
             '2A': 42, '1A': 26, 'D3': 211, 'D4': 212, '92': 146, 'C0': 192,
             '46': 70, '9E': 158, '03': 3, '7E': 126, '7F': 127, 'BF': 191,
             '89': 137, '33': 51, '0D': 13, 'E9': 233, 'E1': 225, '0C': 12,
             'C6': 198, '04': 4, '8B': 139, '1D': 29, '50': 80, '66': 102,
             '28': 40, 'D6': 214, 'C9': 201, '64': 100, 'D9': 217, '54': 84,
             'C4': 196, '08': 8, '2E': 46, '88': 136, 'DF': 223, '7C': 124,
             '0F': 15, 'A8': 168, '17': 23, 'A6': 166, '3D': 61, '94': 148,
             'B8': 184, 'AB': 171, '48': 72, '2F': 47, '3C': 60, 'D2': 210,
             '09': 9, 'E6': 230, 'F2': 242, '26': 38, '81': 129, 'CD': 205,
             '2D': 45, '90': 144, '4E': 78, '1C': 28, '2B': 43, '40': 64,
             'A2': 162, 'F9': 249, '5B': 91}

     @staticmethod
     def changets(data):
          return Change.ten_sit.get(data)
     @staticmethod
     def changest(str_data):
         return Change.sit_ten.get(str_data)
     @staticmethod
     def change_list_ts(lts):
         return list(map(Change.changets,lts))
     @staticmethod
     def change_list_st(lst):
         return list(map(Change.changest,lst))

后续对报文的处理将持续更新。

猜你喜欢

转载自blog.csdn.net/whynat/article/details/82528860