在python中以二进制形式编写ASCII字符串

f87krz0w  于 2023-02-28  发布在  Python
关注(0)|答案(2)|浏览(120)

我有一个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字符串来实现这一点?

qeeaahzv

qeeaahzv1#

您误解了\xhh在Python字符串中的作用,在Python字符串中使用\x表示法 * 只是语法 * 来产生特定的代码点。
可以使用'\x61'生成字符串,也可以使用'a';这两种说法都是“* 给予我一个字符串,其中包含十六进制值为61的字符,例如a ASCII字符 *”:

>>> b'\x61'
'a'
>>> b'a'
'a'
>>> b'a' == b'\x61'
True

那么\xhh语法是 * 而不是值 *;在最终结果中不存在\x以及61字符。
你应该 * 只写你的字节串 *:

somestring = b'abcd'

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

注意,我在这里的代码示例中使用了bytestrings(b'...')。'Regular'字符串是Unicode数据,不经过编码就不能写入二进制文件。\x..同样的转义语法也适用于普通的文本字符串语法,但在写入时需要将字符串编码为字节:

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

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

你当然不需要用十六进制转义来写二进制数据。仅仅因为一些二进制文件查看器用十六进制表示文件中的数据并不意味着数据是以十六进制形式写的!
最初,这个答案是针对Python 2编写的,在Python 2中,二进制文件和常规文本文件之间的区别并不明显,在那里,与以文本模式打开的文件的唯一区别是二进制文件不会自动将\n换行符转换为您的平台的行分隔符标准;例如,在Windows上写入\n会生成\r\n

qv7cva1a

qv7cva1a2#

我认为你不一定理解什么是binary/ascii...所有的文件都是二进制的意义上说,它只是位。ascii只是一些位的表示... 99.9999%的文件编辑器将显示您的位作为ascii,如果他们可以,如果没有其他编码声明在文件本身...

fp.write("abcd")

完全等价于

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

相关问题