繁体   English   中英

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

[英]How to convert hexadecimal string to bytes in Python?

我有一个很长的十六进制字符串,代表一系列不同类型的值。 我需要将此十六进制字符串转换为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+'

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

>>> hex_string = "deadbeef"

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

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

将其转换为字节对象(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"

bytearray 中有一个内置函数可以执行您想要的操作。

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

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

如果我理解正确,你应该寻找 binascii.unhexlify

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

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

"\x12\x45\x00\xAB"

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

import struct

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

#val = (18, 69, 43776)

当我在格式字符串的开头指定小端(使用'<'字符)时,该函数返回十进制等效值。

0x12 = 18

0x45 = 69

0xAB00 = 43776

B 等于一个字节(8 位)无符号

H 等于两个字节(16 位)无符号

更多可用的字符和字节大小可以在这里找到

优点是..

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

缺点..

你真的需要知道你处理的数据的类型和长度

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

import codecs

codecs.decode(hexstring, 'hex_codec')

您应该能够使用以下内容构建一个包含二进制数据的字符串:

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

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

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

hex_string = "deadbeef"
data = ["0x" + hex_string[i:i+2] for i in range(0,len(hex_string), 2)]
def hex2bin(s):
    hex_table = ['0000', '0001', '0010', '0011',
                 '0100', '0101', '0110', '0111',
                 '1000', '1001', '1010', '1011',
                 '1100', '1101', '1110', '1111']
    bits = ''
    for i in range(len(s)):
        bits += hex_table[int(s[i], base=16)]
    return bits

一个好的班轮是:

byte_list = map(ord, hex_string)

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

-乔什

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM