Python在写入文件时使用什么字节序?
在使用file.write()方法并加上'wb'标志时,Python是使用大端字节序还是小端字节序,或者是根据系统的字节顺序值呢?我怎么能确保字节序不是随机的呢?我之所以问这个,是因为我在同一个文件中混合了ASCII和二进制数据,而对于二进制数据我使用struct.pack()并强制它使用小端字节序,但我不确定ASCII数据会发生什么!
编辑 1:自从收到反对票后,我想更详细地解释一下我的问题!
我正在写一个包含ASCII和二进制数据的文件,这个文件会在x86的电脑上生成,然后通过网络发送到另一台不是x86的电脑,也就是PowerPC,它使用的是大端字节序,我怎么能确保在PowerPC上解析时数据是一样的呢?
编辑 2:我仍然在使用Python 2.7
3 个回答
注意:我假设使用的是Python 3。
在写ASCII或字节字符串时,字节的顺序并不是个问题。因为字节的顺序已经由它们在ASCII或字节字符串中出现的顺序决定了。字节序是编码的一种特性,它将某个值(比如一个16位的整数或一个Unicode字符)映射到多个字节上。当你得到一个字节字符串时,字节序已经被确定并应用了(这是由字节字符串的来源决定的)。
如果你想把unicode
字符串写入一个没有用b
模式打开的文件,那么问题就取决于这些字符串是如何编码的(它们必须被编码,因为文件系统只接受字节)。编码又取决于文件本身,可能还和地区设置或环境变量有关(比如默认的sys.stdout
)。当这引发问题时,问题不仅仅是字节序的问题。不过,你的文件是二进制的,所以你不能直接写unicode,你必须明确地进行编码和解码。使用任何固定的编码方式,就不会有字节序的问题,因为编码的字节序是固定的,并且是编码定义的一部分。
它使用了 sys.byteorder。所以只需要:
import sys
if 'little' == sys.byteorder:
# little
else:
# big
对于多字节数据,它默认遵循机器的架构。如果你想让它在不同平台上都能工作,那你就需要强制指定。
ASCII和UTF-8每个字符都是用一个字节来编码的,那它会受到字节顺序的影响吗?不会。
下面是如何打包小端 <
或大端 >
的方法:
import struct
struct.pack('<L', 1234)
'\xd2\x04\x00\x00'
struct.pack('>L', 1234)
'\x00\x00\x04\xd2'
如果你使用UTF-16,也可以用这种方式将字符串编码为大端或小端,举个例子:
s.encode('utf-16LE')
s.encode('utf-16BE')
UTF-8和ASCII没有字节顺序的问题,因为它们每个字符只用一个字节。