Python 字节数组 和 16进制字符串转换

在例子中对指定的字符串:

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)

出自:

stackoverflow

https://www.cnblogs.com/luke0011/p/9278777.html

猜你喜欢

转载自blog.csdn.net/Yuyh131/article/details/84672130