Python中字节数组和16进制字符串转换方式
作者:EUNC
Python字节数组和16进制字符串转换
参考示例1
以下示例仅供参考,性能高低以实际测试情况为准,这里只考虑能否实现数据转换
字节(bytes)转字符串(str)
rec_msg = b'\x12\x55\xaa\xFF\x55\x34' out_s = '' for i in range(0, len(rec_msg)): # 获取字节数组字数据,注意引号 ' ' 之间有一个空格 out_s = out_s + ' ' + (hex(int(rec_msg[i]))).upper()[2:].zfill(2) print(out_s) # >>> 12 55 AA FF 55 34
转换原理解析:分离出byte,转为int(), 再hex()转回16进制数后截取0x前缀,再遍历拼接成字符串
参考示例2
在例子中对指定的字符串:
faa5fbb5fcc5fdd5010200000028000001900000000a002d00000000017d7840000003e800005fa55fb55fc55fd5
使用了三种方法将其转换为大写字母并每隔2个字符用空格分割处理后得到一个新字符串,为:
FA A5 FB B5 FC C5 FD D5 01 02 00 00 00 28 00 00 01 90 00 00 00 0A 00 2D 00 00 00 00 01 7D 78 40 00 00 03 E8 00 00 5F A5 5F B5 5F C5 5F D5
为验证三种方法的执行效率,对原字符串扩充为其100倍长度,然后执行10000次处理,从其耗时结果上看,第一种方法最慢,第二、三种方法较好。
# -*- coding: utf-8 -*-# #------------------------------------------------------------------------------- # Name: MySplit # Description: 将指定的字符串转换为大写字母并每隔2个字符用空格分割后得到一个新字符串 # Author: Administrator # Date: 2018/7/6 #------------------------------------------------------------------------------- import re import time #待分割字符串 myStr = 'faa5fbb5fcc5fdd5010200000028000001900000000a002d00000000017d7840000003e800005fa55fb55fc55fd5' #分割后: FA A5 FB B5 FC C5 FD D5 01 02 00 00 00 28 00 00 01 90 00 00 00 0A 00 2D 00 00 00 00 01 7D 78 40 00 00 03 E8 00 00 5F A5 5F B5 5F C5 5F D5 def mySplit1(str): t='' for i in range(len(str)/2): t += str[2*i:2*(i+1)] + ' ' t = t.upper() return t def mySplit2(str): t = str.upper() p = re.compile('.{1,2}') # 匹配任意字符1-2次 return ' '.join(p.findall(t)) def mySplit3(str): t = str.upper() return ' '.join([t[2*i:2*(i+1)] for i in range(len(t)/2)]) print('原始字符串:\n' + myStr + '\n') print('转换后字符串:') print('mySplit1: ' + mySplit1(myStr)) print('mySplit2: ' + mySplit2(myStr)) print('mySplit3: ' + mySplit3(myStr)) print(u'\n耗时测试:') myStr = myStr * 100 for f in [mySplit1, mySplit2, mySplit3]: t = time.time() for i in range(10000): f(myStr) print(f.func_name + ': ' + str(time.time()-t) + ' s')
假设:
hex_string = “deadbeef”
转换成字符串格式
>>> hex_data = hex_string.decode("hex") >>> hex_data "\xde\xad\xbe\xef"
转换成字节数组
>>> import array >>> array.array('B', hex_data) array.array('B', [0xDE, 0xAD, 0xBE, 0xEF])
转换成字节列表
>>> map(ord, hex_data) [0xDE, 0xAD, 0xBE, 0xEF]
如果是2.6以后版本:
>>> bytearray(hex_data) bytearray(b'\xde\xad\xbe\xef')
然而有可能出现无法打印的字符串,例如:\x12\x45\x00AB
这种情况下:不要用.decode(“hex”)
下面的将返回bytearray,并在python3中正常工作
bytearray.fromhex(“de ad be ef 00”)
使用binascii
import binascii a='45222e' s=binascii.unhexlify(a) b=[ord(x) for x in s]
直接编写程序
data = "fef0babe" bits = "" for x in xrange(0, len(data), 2) bits += chr(int(data[x:x+2], 16))
还原byte型字符串
binascii.b2a_hex(hex_data)
Python简单的16进制转字符串
Python以字符串形式存在的16进制数,转为该16进制对应的ascii字符串比较麻烦。
如:
hex_str = ‘7468616e6b20796f752076657279206d75636821' # thank you very much!
首先要将其转为16进制数
hex = hex_str.encode(‘utf-8')
然后再转为字符串
str_bin = binascii.unhexlify(hex) str = str_bin.decode(‘utf-8')
函数:
import binascii def hexStr_to_str(hex_str): hex = hex_str.encode('utf-8') str_bin = binascii.unhexlify(hex) return str_bin.decode('utf-8') if __name__ == "__main__": hex_str = '7468616e6b20796f752076657279206d75636821' print(hexStr_to_str(hex_str))
简单方法来了
我们知道,base16编码就是将字符用16进制表示
'a' =base16=> b'61'
那么简单对16进制字符串进行base16解码即可
import base64 hex_str = '7468616e6b20796f752076657279206d75636821' print(base64.b16decode(hex_str.upper()))
总结
以上为个人经验,希望能给大家一个参考,也希望大家多多支持脚本之家。