2014-05-23 32 views
2

当使用file.write()和'wb'标志时,Python是使用big或litte endian还是sys.byteorder的值?我怎么能确定的字节序不是随机的,我问,因为我混合ASCII和二进制数据在同一个文件和二进制数据我使用struct.pack()并强制它的小端,但我不是确定发生了什么ASCII数据!Python用于写入文件的字节顺序是什么?

编辑1:由于downvote,我会解释更多我的问题!

我正在写一个带有ASCII和二进制数据的文件,在一台x86 PC中,该文件将通过网络发送给另一台不是x86的计算机,一个PowerPC,女巫在Big-endian上,我该怎么做确保使用PowerPC进行分析时数据是相同的?

编辑2:仍然使用Python 2.7

+0

不是真的,我看到了这个问题,他问了有关ASCII数据,在我的情况下,我使用2格式,ASCII和二进制,因为ASCII我不使用任何包装与结构,二进制数据,我知道排序,因为我强迫它很少。 –

+0

我没有看到ISO-8859-1所谓的ASCII数据与您写入文件的任何其他内容有什么不同。 –

+0

谢谢,所以我怎么强制它,因为我正在处理的文件是在x86机器上创建的,而另一个程序是在Power PC上运行的 –

回答

2

对于多字节数据,它默认遵循机器的体系结构。如果你需要它跨平台工作,那么你会想要强制它。

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没有字节序,因为它是每个字符1字节。

+0

这是我的问题伴侣,所以我怎么强制它,因为我正在处理的文件是在x86机器上创建的,而另一个程序是在Power PC上运行的! –

+0

你能举一个“多字节数据”的例子吗?我怀疑你正在假设Python以外的语言。 – delnan

+0

那么也许不是它的正确名词。 ASCII存储在每个字符的单个字节中。作为一个例子,UTF-16是多字节的。 – woot

1

它使用sys.byteorder。所以只是:

import sys 

if 'little' == sys.byteorder: 
    # little 
else: 
    # big 
1

注:我认为写ASCII或字节的字符串时Python 3的

字节顺序是不是一个问题。这些字节的顺序已经由ASCII /字节字符串中出现这些字节的顺序来设置。字节序是编码的一个属性,它将一些值(例如16位整数或Unicode码点)映射到几个字节。当你有一个字节字符串时,字节序已经被决定和应用(由字节串的来源)。

如果你写unicode字符串文件打开与b模式,这个问题取决于这些字符串是如何编码(他们一定的编码,因为文件系统只接受字节)。编码依次取决于文件,可能还取决于语言环境或环境变量(例如,默认为sys.stdout)。当这导致问题时,问题不仅仅局限于排序。然而,你的文件是二进制的,所以你不能直接写unicode,你必须明确地编码和解码。用任何固定编码做这件事,不会有代码问题,因为编码的字节顺序是固定的,并且是编码定义的一部分。

相关问题