如何在Python中将十六进制字符串转换为字节?

icnyk63a  于 2023-01-24  发布在  Python
关注(0)|答案(8)|浏览(240)

我有一个很长的十六进制字符串,它代表了一系列不同类型的值。我需要将此十六进制字符串转换为bytesbytearray,以便从原始数据中提取每个值。我该如何做呢?
例如,字符串"ab"应该转换为字节b"\xab"或等效的字节数组。

>>> # what to use in place of `convert` here?
>>> convert("8e71c61de6a2321336184f813379ec6bf4a3fb79e63cd12b")
b'\x8eq\xc6\x1d\xe6\xa22\x136\x18O\x813y\xeck\xf4\xa3\xfby\xe6<\xd1+'
juud5qan

juud5qan1#

假设十六进制字符串类似于

>>> hex_string = "deadbeef"

将其转换为字节数组(Python 3和Python 2.7):

>>> bytearray.fromhex(hex_string)
bytearray(b'\xde\xad\xbe\xef')

将其转换为bytes对象(Python 3):

>>> bytes.fromhex(hex_string)
b'\xde\xad\xbe\xef'

注意,bytesbytearray的不可变版本。

将其转换为字符串(Python ≤ 2.7):

>>> hex_data = hex_string.decode("hex")
>>> hex_data
"\xde\xad\xbe\xef"
scyqe7ek

scyqe7ek2#

bytearray中有一个内置函数,可以完成您想要的操作。

bytearray.fromhex("de ad be ef 00")

它返回一个bytearray并读取带或不带空格分隔符的十六进制字符串。

gupuwyp2

gupuwyp23#

如果我理解正确,您应该查找binasci.unhexlify

import binascii
a='45222e'
s=binascii.unhexlify(a)
b=[ord(x) for x in s]
hgtggwj0

hgtggwj04#

假设你有一个这样的字节串

“一个字母”

并且您知道字节的数量及其类型,您也可以使用此方法

import struct

bytes = '\x12\x45\x00\xAB'
val = struct.unpack('<BBH', bytes)

#val = (18, 69, 43776)

由于我在格式字符串的开头指定了little endian(使用"〈“字符),所以函数返回的是等价的十进制数。
0x12 = 18
0x45 = 69
0xAB00 = 43776
B等于一个无符号字节(8位)
H等于两个无符号字节(16位)
更多可用的字符和字节大小可在此处找到

优点是..

您可以指定多个字节和值的字节序

缺点

您确实需要知道所处理的数据的类型和长度

v64noz0r

v64noz0r5#

您可以使用Python标准库中的Codecs module,即

import codecs

codecs.decode(hexstring, 'hex_codec')
vbopmzt1

vbopmzt16#

您应该能够使用以下代码构建一个保存二进制数据的字符串:

data = "fef0babe"
bits = ""
for x in xrange(0, len(data), 2)
  bits += chr(int(data[x:x+2], 16))

这可能不是最快的方法(许多字符串追加),但是只使用核心Python就非常简单。

fdbelqdn

fdbelqdn7#

有时字节数组转换不起作用,因此在这种情况下,您可以这样做:

hex_string = "deadbeef"
data = ["0x" + hex_string[i:i+2] for i in range(0,len(hex_string), 2)]
k5hmc34c

k5hmc34c8#

好的一句话是:

byte_list = map(ord, hex_string)

这将遍历字符串中的每个字符,并通过ord()函数运行它,只在python 2.6上测试过,对python 3.0+不太确定。

  • 乔希

相关问题