我有一个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()
但我如何用" abcdef"来实现这个目标。 ASCII字符串。 ?
答案 0 :(得分:12)
你误解了\xhh
在Python字符串中的作用。在Python字符串中使用\x
表示法只是语法以生成某些代码点。
您可以使用'\x61'
生成字符串,也可以使用'a'
;两种方式都只是说两种方式给我一个字符串,其中包含一个十六进制值为61的字符,例如a
ASCII字符:
>>> '\x61'
'a'
>>> 'a'
'a'
>>> 'a' == '\x61'
True
然后,\xhh
语法不是值;最终结果中没有\
且没有x
且没有6
和1
字符。
你应该只写你的字符串:
somestring = 'abcd'
with open("test.bin", "wb") as file:
file.write(somestring)
二进制文件没有什么神奇之处;与文本模式下打开的文件唯一不同的是,二进制文件不会自动将\n
换行符转换为您平台的行分隔符标准;例如在Windows上写\n
会产生\r\n
。
您当然不必生成十六进制转义来写二进制数据。
在Python 3上,字符串是Unicode数据,不能在没有编码的情况下写入文件,但在Python上,str
类型是已经编码的字节。所以在Python 3上你可以使用:
somestring = 'abcd'
with open("test.bin", "wb") as file:
file.write(somestring.encode('ascii'))
或者您使用字节字符串文字; b'abcd'
。
答案 1 :(得分:2)
我认为你不一定了解二进制文件/ ascii是什么...所有文件都是二进制的,只是它的位。 ascii只是一些位的表示...如果可以的话,99.9999%的文件编辑器会将您的位显示为ascii,如果文件本身没有声明其他编码...
fp.write("abcd")
完全等同于
fp.write("\x61\x62\x63\x64")