在Python中将ASCII字符串转换为二进制

12

我有一个ASCII字符串="abcdefghijk"。我想用Python将其以二进制格式写入二进制文件。

我尝试了以下方法:

str  = "abcdefghijk"
fp = file("test.bin", "wb")
hexStr = "".join( (("\\x%s") % (x.encode("hex"))) for x in str)
fp.write(hexStr)
fp.close()

但是,当我打开test.bin文件时,我看到的是ASCII格式而不是二进制格式。

\x61\x62\x63\x64\x65\x66\x67

我理解是因为这里有两个反斜杠 ("\\x%s")。我该如何解决这个问题?谢谢。

更新:

以下代码给了我期望的结果:

file = open("test.bin", "wb")
file.write("\x61\x62\x63\x64\x65\x66\x67")
file.close() 

但是如何在ASCII字符串"abcdef"中实现这一点呢?


1
你非常小心地将字符编码为十六进制 - 你为什么期望看到其他东西呢? - jonrsharpe
你期望的输出是什么?我不确定你是否理解二进制模式的作用,甚至Python使用\xhh符号表示什么(它只是语法,一种产生值的方式,而不是值本身)。 - Martijn Pieters
@jonrsharpe,我想将"\x61\x62\x63\x64\x65\x66\x67"以二进制形式写入test.bin文件(而不是作为ASCII字符串)。我该怎么做?最终,test.bin应该是一个二进制文件。 - aMa
1
@aMa:所有文件都是二进制的。在文本模式下打开文件只能启用特殊的换行处理(在Windows上,会导致0x0a被解释为文件结束)。因此,只需写入 'abcd' 即可。在Python 3中,您需要使用 str.encode('ascii') 将文本编码为字节。 - Martijn Pieters
2
@aMa:然而,二进制文件并不是十六进制的序列!一些十六进制编辑器可能会将内容显示为十六进制,但那只是表示方式,而不是文件中实际的值。 - Martijn Pieters
@aMa 或许“完全等价”这个词并不够清晰明了? - Joran Beasley
2个回答

17

你误解了Python字符串中\xhh的作用。在Python字符串中使用\x表示法只是产生某些代码点的语法。

你可以使用'\x61'来产生一个字符串,或者你可以使用'a';两种方式都是表达“给我一个十六进制值为61的字符的字符串,例如ASCII字符a”的两种方法:

>>> b'\x61'
'a'
>>> b'a'
'a'
>>> b'a' == b'\x61'
True
\xhh 语法并不是最终结果的值;在最终结果中没有 \x61 字符。你只需要写出你的字节串即可:
somestring = b'abcd'

with open("test.bin", "wb") as file:
    file.write(somestring.encode())

请注意,我在这里的代码示例中使用了字节串(b'...')。 '普通'字符串是Unicode数据,不能直接写入二进制文件而不进行编码。 \x..相同的转义语法也适用于常规文字字符串语法,但在写入时需要将字符串编码为字节:

somestring = '\x61bcd'  # value: 'abcd'

with open("test.bin", "wb") as file:
    file.write(somestring.encode('ascii'))

你并不需要使用十六进制转义序列来编写二进制数据。仅因为一些二进制文件查看器以十六进制形式表示文件中的数据,这并不意味着数据是以十六进制形式编写的!

最初,这个答案是针对Python 2 编写的,那里二进制和普通文本文件之间的区别不太明显。在那里,与以文本模式打开的文件唯一的区别是二进制文件不会自动将 \n 换行符转换为您平台的换行符标准;例如,在Windows上写入 \n 会产生 \r\n


2

我认为你可能不太理解什么是二进制/ASCII码...所有文件都是二进制的,因为它只是由比特组成。 ASCII码只是一些比特的表示方式...99.9999%的文件编辑器会将您的比特显示为ASCII码,如果可以的话,并且如果文件本身没有声明其他编码方式...

fp.write("abcd") 

完全等价于

fp.write("\x61\x62\x63\x64")

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接