簡體   English   中英

為什么我們在這里需要字節序?

[英]Why do we need endianness here?

我正在閱讀一個源代碼 ,它下載zip文件並將數據讀入numpy數組。 代碼假設在macos和linux上工作,這里是我看到的片段:

def _read32(bytestream):
    dt = numpy.dtype(numpy.uint32).newbyteorder('>')
    return numpy.frombuffer(bytestream.read(4), dtype=dt)

此功能用於以下上下文:

with gzip.open(filename) as bytestream:
    magic = _read32(bytestream)

不難看出這里發生了什么,但我對newbyteorder('>')的目的感到困惑。 我閱讀了文檔 ,並知道端點是什么意思,但無法理解為什么開發人員添加了newbyteorder(在我看來並不是真的需要)。

這是因為下載的數據采用大端格式,如源頁面中所述:http: //yann.lecun.com/exdb/mnist/

文件中的所有整數都以大多數非英特爾處理器使用的MSB優先(高端)格式存儲。 英特爾處理器和其他低端機器的用戶必須翻轉標頭的字節。

它只是一種確保以正確的順序從結果數組中解釋字節的方法,而不管系統的本機字節順序如何。

默認情況下,內置的NumPy整數dtypes將使用系統本機的byteorder。 例如,我的系統是little-endian,所以簡單地使用numpy.dtype(numpy.uint32)將意味着從具有big-endian順序的字節的緩沖區讀入數組的值將無法正確解釋。

如果np.frombuffer是為了接收已知在特定字節np.frombuffer中的字節,最佳做法是使用newbyteorder修改newbyteorder 這在np.frombuffer文檔中np.frombuffer

筆記

如果緩沖區的數據不是機器字節順序,則應將其指定為數據類型的一部分,例如:

 >>> dt = np.dtype(int) >>> dt = dt.newbyteorder('>') >>> np.frombuffer(buf, dtype=dt) 

結果數組的數據不會被字節刪除,但會被正確解釋。

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM