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

 更新时间:2023年06月03日 15:37:54   作者:EUNC  
这篇文章主要介绍了Python中字节数组和16进制字符串转换方式,具有很好的参考价值,希望对大家有所帮助。如有错误或未考虑完全的地方,望不吝赐教

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()))

总结

以上为个人经验,希望能给大家一个参考,也希望大家多多支持脚本之家。

相关文章

  • 使用Playwright进行视觉回归测试详解

    使用Playwright进行视觉回归测试详解

    这篇文章主要介绍了使用Playwright进行视觉回归测试详解,视觉回归测试是一种软件测试技术,专注于检测Web应用程序或网站的用户界面中的视觉变化和差异,需要的朋友可以参考下
    2023-08-08
  • 浅析python多线程中的锁

    浅析python多线程中的锁

    这篇文章主要介绍了浅析python多线程中的锁,锁由Python的threading模块提供,并且它最多被一个线程所持有,当一个线程试图获取一个已经锁在资源上的锁时,该线程通常会暂停运行,直到这个锁被释放,需要的朋友可以参考下
    2023-07-07
  • 如何用Python Beautiful Soup解析HTML内容

    如何用Python Beautiful Soup解析HTML内容

    Beautiful Soup是一种Python的解析库,主要用于解析和处理HTML/XML内容,详细介绍Beautiful Soup的使用方式和应用场景,本文给大家介绍的非常详细,需要的朋友可以参考下
    2023-05-05
  • python制图之小提琴图示例代码

    python制图之小提琴图示例代码

    这篇文章主要介绍了python制图之小提琴图的相关资料,提琴图结合箱线图和核密度估计,展示数据分布和概率密度,文中通过代码介绍的非常详细,需要的朋友可以参考下
    2025-03-03
  • python网络编程之进程详解

    python网络编程之进程详解

    这篇文章主要为大家介绍了python网络编程之进程,具有一定的参考价值,感兴趣的小伙伴们可以参考一下,希望能够给你带来帮助
    2022-01-01
  • 详解Python中open()函数指定文件打开方式的用法

    详解Python中open()函数指定文件打开方式的用法

    well,我们这里所指的文件打开方式并不是指调用什么应用程序去打开某个文件,而是只读只写或者二进制等的打开方式,这里我们就来详解Python中open()函数指定文件打开方式的用法
    2016-06-06
  • Python中实现常量(Const)功能

    Python中实现常量(Const)功能

    这篇文章主要介绍了Python中实现常量(Const)功能,python语言本身没有提供const,本文使用一个类来实现常量定义功能,并介绍了使用方法,需要的朋友可以参考下
    2015-01-01
  • Python根据指定日期计算后n天,前n天是哪一天的方法

    Python根据指定日期计算后n天,前n天是哪一天的方法

    这篇文章主要介绍了Python根据指定日期计算后n天,前n天是哪一天的方法,涉及Python日期与时间计算相关操作技巧,需要的朋友可以参考下
    2018-05-05
  • python3 图片 4通道转成3通道 1通道转成3通道 图片压缩实例

    python3 图片 4通道转成3通道 1通道转成3通道 图片压缩实例

    今天小编就为大家分享一篇python3 图片 4通道转成3通道 1通道转成3通道 图片压缩实例,具有很好的参考价值,希望对大家有所帮助。一起跟随小编过来看看吧
    2019-12-12
  • 12步教你理解Python装饰器

    12步教你理解Python装饰器

    或许你已经用过装饰器,它的使用方式非常简单但理解起来困难(其实真正理解的也很简单),想要理解装饰器,你需要懂点函数式编程的概念,python函数的定义以及函数调用的语法规则等,感兴趣的小伙伴们可以参考一下
    2016-02-02

最新评论