[英]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.