Warning: file_get_contents(/data/phpspider/zhask/data//catemap/8/file/3.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
在python中以二进制形式编写ASCII字符串_Python_File_Binary_Fwrite - Fatal编程技术网

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

在python中以二进制形式编写ASCII字符串,python,file,binary,fwrite,Python,File,Binary,Fwrite,我有一个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格式的,而不是二进制格式的 \

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

我认为您不一定理解什么是二进制/ascii。。。所有的文件都是二进制的,因为它们只是位。ascii只是一些位的表示。。。99.9999%的文件编辑器会将您的位显示为ascii(如果可以),并且如果文件本身中没有声明其他编码

fp.write("abcd") 
完全等同于


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

您可以使用
'\x61'
生成字符串,也可以使用
'a'
;这两种方法都只是说,给我一个十六进制值为61的字符串,例如
a
ASCII字符:

因此,
\xhh
语法不是值;最终结果中没有
\
x
以及
6
1
字符

您应该只编写字符串:

二进制文件没有什么神奇之处;与以文本模式打开的文件的唯一区别是,二进制文件不会自动将
\n
换行符转换为平台的行分隔符标准;e、 g.在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'

您非常小心地将字符编码为十六进制-为什么您希望看到其他内容?您希望得到什么输出?我不确定您是否了解二进制模式的作用,甚至不知道Python使用了什么表示法(它只是语法,一种生成值的方法,而不是值本身)。@jornsharpe,我想将“\x61\x62\x63\x64\x65\x66\x67”作为二进制写入test.bin(而不是ascii字符串)。我该怎么做?最后,test.bin应该是一个二进制文件。@aMa:所有文件都是二进制文件。在文本模式下打开文件仅启用换行符的特殊处理(在Windows上,会将0x0a解释为文件的结尾)。因此,只需编写
'abcd'
。在Python3上,您需要使用
str.encode('ascii')
@aMa将文本编码为字节:但是,二进制文件不是十六进制序列!一些十六进制编辑器可能会将内容显示为十六进制,但这只是表示,而不是文件中的实际值。很好的澄清,我总是忘记Py3中的字符串更改。您可以更进一步
'a'is'\x61'
@JoranBeasley:不,您不能。CPython解释器可能会选择进行优化,您可能最终得到相同的字符串对象(然后
is
工作),但这是不可取的,您永远不要指望它。好吧,公平点。。。我想用单兵也许没关系。。。在贝壳里,它每次都对我有用。。。但这只是一个测试(你确定在单字节范围内使用单字符(即小于255个)不安全吗)?就像小整数一样?@JoranBeasley:请参阅了解Python字符串内部和常量对象的当前状态;这是一个实现细节,不应依赖。
>>> '\x61'
'a'
>>> 'a'
'a'
>>> 'a' == '\x61'
True
somestring = 'abcd'

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

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