Warning: file_get_contents(/data/phpspider/zhask/data//catemap/4/string/5.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Python 字节数组到十六进制字符串_Python_String_Python 2.7_Bytearray - Fatal编程技术网

Python 字节数组到十六进制字符串

Python 字节数组到十六进制字符串,python,string,python-2.7,bytearray,Python,String,Python 2.7,Bytearray,我将数据存储在字节数组中。如何将此数据转换为十六进制字符串 我的字节数组示例: array_alpha = [ 133, 53, 234, 241 ] 使用: 或使用 注意:在format语句中,02表示如果需要,它将填充最多2个前导的0s。这很重要,因为[0x1,0x1,0x1]即(0x010101)将被格式化为“111”,而不是“010101” 或用于: 以下是Python 3.6.1中上述方法的基准: 从timeit导入timeit 导入binascii 数量=10000 def使用_

我将数据存储在字节数组中。如何将此数据转换为十六进制字符串

我的字节数组示例:

array_alpha = [ 133, 53, 234, 241 ]
使用:

或使用

注意:在format语句中,
02
表示如果需要,它将填充最多2个前导的
0
s。这很重要,因为
[0x1,0x1,0x1]即(0x010101)
将被格式化为
“111”
,而不是
“010101”

或用于:


以下是Python 3.6.1中上述方法的基准:

从timeit导入timeit
导入binascii
数量=10000
def使用_str_format()->str:
返回“.join(“{:02x}”。测试对象中x的格式(x)
def使用_format()->str:
返回“.join(test_obj中x的格式(x,“02x”)
使用_hexlify()->str定义:
返回binascii.hexlify(bytearray(test_obj)).decode('ascii')
def do_测试():
打印(“使用{}-字节{}:”.format(len(test_obj),test_obj.\uu类{uuu.\uu名称})进行测试)
如果使用_str_format()!=使用_格式()!=使用_hexlify():
引发运行时错误(“结果不相同”)
打印(“使用str.format->”+str(timeit(使用str\u格式,number=number)))
打印(“使用格式->”+str(timeit(使用_格式,number=number)))
打印(“使用binascii.hexlify->”+str(timeit(使用_hexlify,number=number)))
test_obj=字节([i代表范围内的i(255)])
do_test()
test_obj=bytearray([i代表范围内的i(255)])
do_test()
结果:

bytearray + hexlify -> 0.011218150997592602
byte + hex          -> 0.005952142993919551
使用255字节进行测试:
使用str.format->1.459474583090427
使用格式->1.5809937679100738
使用binascii.hexlify->0.0145214 26401399307
使用255字节字节字节数组进行测试:
使用str.format->1.443447684109402
使用格式->1.5608712609513171
使用binascii.hexlify->0.01414164661833684

使用
格式的方法确实提供了额外的格式选项,例如用空格分隔数字
”。join
、逗号
“、”。join
、大写印刷
“{:02X}”。format(x)
/
格式(x,“02X”)
,等等,但代价是对性能有很大影响。

,如果您是函数式编程的爱好者:

hex_string = "".join("%02x" % b for b in array_alpha)
>>> a = [133, 53, 234, 241]
>>> "".join(map(lambda b: format(b, "02x"), a))
8535eaf1
>>>

如果有numpy阵列,则可以执行以下操作:

>>> import numpy as np
>>> a = np.array([133, 53, 234, 241])
>>> a.astype(np.uint8).data.hex()
'8535eaf1'
请考虑Python 3.5及更高版本上的
字节的类型:

>>> array_alpha = [ 133, 53, 234, 241 ]
>>> print(bytes(array_alpha).hex())
8535eaf1
编辑:它也比hexlify快得多(上面修改了@falsetru的基准测试)

结果:

bytearray + hexlify -> 0.011218150997592602
byte + hex          -> 0.005952142993919551

你的最后一个技巧在我的系统上告诉我
b'8535eaf1'
,什么是
b
?@GrijeshChauhan,你在使用Python 3.x吗?在Python 3.x binascii.hexlify中,返回
字节
对象。是的,我的Python是3.3.2。--<代码>返回字节对象
-字节对象的意思是什么?类似于
int
object?@GrijeshChauhan,请参见。@mkingston,您可以省略编码:
b'8535eaf1'。decode()
related:这需要导入外部库,并且不能解决OP正在处理字节的事实。“这不是最可靠的解决方案。”物理学家删除了“可靠解决方案”部分。我仍然认为numpy解决方案对来自谷歌的其他人来说是有用的(在numpy矩阵中的数据比在字节数组中的数据更常见)。我仍然认为回答OP的问题是一个好主意,而不是发表一篇可能对某人有用的一般性文章。在谷歌搜索如何处理numpy数组的人不太可能会遇到题为“字节数组到十六进制字符串”的问题。这只是一种更糟糕的拼写方式,即bytearray([133,53,234,241])。Hex()
我想我误解了你的答案。你的意思是“如果你有一个numpy数组,你就可以这样做”,而不是“你可以用numpy作为工具来做”谢谢你提供了一个同样适用于python旧版本的答案(这里被迫使用2.5.1)@Baldrickk是的,有这么多离题答案真是太令人惊讶了。问题被标记为
python2.7
。请注意,bytearray+hexlify以字节形式返回数据(b'34567890aed'),而byte+hex以字符串形式返回数据(34567890aed)
>>> array_alpha = [ 133, 53, 234, 241 ]
>>> print(bytes(array_alpha).hex())
8535eaf1
from timeit import timeit
N = 10000
print("bytearray + hexlify ->", timeit(
    'binascii.hexlify(data).decode("ascii")',
    setup='import binascii; data = bytearray(range(255))',
    number=N,
))
print("byte + hex          ->", timeit(
    'data.hex()',
    setup='data = bytes(range(255))',
    number=N,
))
bytearray + hexlify -> 0.011218150997592602
byte + hex          -> 0.005952142993919551