2014-05-23 61 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,你必須明確地編碼和解碼。用任何固定編碼做這件事,不會有代碼問題,因爲編碼的字節順序是固定的,並且是編碼定義的一部分。

相關問題