Python3 ASCII十六进制到二进制字符串转换

时间:2012-10-07 03:47:40

标签: python

我在Windows上使用Python 3.2.3,并且正在尝试将C风格的ASCII文件中的二进制数据转换为其二进制等效项,以便稍后使用struct模块进行解析。例如,我的输入文件包含“0x000A 0x000B 0x000C 0x000D”,我想将其转换为“\ x00 \ x0a \ x00 \ x0b \ x00 \ x0c \ x00 \ x0d”。

我遇到的问题是Python 3中的字符串数据类型已经改变,并且从十六进制转换为二进制的内置函数(例如binascii.unhexlify())不再接受常规的unicode字符串,但是只有字节字符串。这个从unicode字符串转换为字节字符串并返回的过程令我困惑,所以我想知道是否有更简单的方法来实现这一点。以下是我到目前为止:

with open(path, "r") as f:
    l = []
    data = f.read()
    values = data.split(" ")

    for v in values:
            if (v.startswith("0x")):
                    l.append(binascii.unhexlify(bytes(v[2:], "utf-8").decode("utf-8")

    string = ''.join(l)

2 个答案:

答案 0 :(得分:1)

正如agf所说,用模式'r'打开图像会给你字符串数据。 因为你在这里做的唯一事情就是查看二进制数据,你可能想用'rb'模式打开你的结果类型字节,而不是str。

类似的东西:

with open(path, "rb") as f:
    l = []
    data = f.read()
    values = data.split(b" ")

    for v in values:
            if (v.startswith(b"0x")):
                    l.append(binascii.unhexlify(v[2:]))

    result = b''.join(l)

答案 1 :(得分:1)

3>> ''.join(chr(int(x, 16)) for x in "0x000A 0x000B 0x000C 0x000D".split()).encode('utf-16be')
b'\x00\n\x00\x0b\x00\x0c\x00\r'