2012-10-07 93 views
2

我在Windows上使用Python 3.2.3,并试图将C样式ASCII文件中的二进制数据转换为其二进制等效文件,以便稍后使用结构模块进行解析。例如,我的输入文件包含“0x000A 0x000B 0x000C 0x000D”,我想将它转换为“\ x00 \ x0a \ x00 \ x0b \ x00 \ x0c \ x00 \ x0d”。Python3 ASCII十六进制转换为二进制字符串

我遇到的问题是,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) 
+0

你尝试打开该文件为二进制? ''rb'' – agf

+0

不,我没有试图以二进制打开文件。我的思路是输入文件使用准C语法,因此不仅需要过滤掉十六进制数字之间的注释和分隔符,还要同时执行十六进制到二进制的转换,这可能会变得棘手。这就是为什么我最终以ASCII模式打开它并将其分割成基于空格分隔符的列表,因为这样我就可以轻松地循环并排除任何不以“0x”开头的内容。 – ddcc

回答

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' 
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) 
相关问题