
假設 A 是 BE 機器,正在傳送 0x44332211 向 LE 機器 B 傳送資料。預設情況下,A 將使用 0x44332211 的 htonl,它只不過是 0x44332211。
現在當0x44332211到達B時,B知道它是BE格式,因此B將使用htonl函數翻轉並將其更改為0x11223344。
這個翻轉是什麼意思?我從網路上讀到這個概念。為什麼存放前需要翻動?
因為在這種情況下,翻轉值 0x11223344 將像 0x44332211 一樣儲存在 LE 中,這與 A 發送的內容不同,因為 B 對它的解釋不同,儘管它們看起來很相似?
/* 從 BE 轉換成 LE 的 */
答案1
大端 C 庫中的htonl()
和函數實際上不執行任何操作(它們是“無操作”)。ntohl()
這樣相同的程式碼可以在BE和LE機器上使用;在LE 機器上使用C lib 編譯時,這些函數將翻轉字節,但在BE 機器上,它們將使它們保持不變,因為網路字節順序是大端字節序,並且主機已經是大端字節序。
換句話說,在您的範例中,BE 機器 A 永遠不會更改任何內容。只有 LE 機器 B 可以。
答案2
實際上,以特定方式儲存之前並不需要翻轉。這是必需的,因為主機使用小端順序,因此當它從網路接收到長於一個位元組的數字時,它會翻轉位元組以正確解釋該數字。在將資料用於任何目的之前,有必要進行這種翻轉。
打個比方,想像一下你自己正在閱讀一本以原始日本方式印刷的漫畫(即通常是最後一頁的漫畫實際上是第一頁)。如果你不知道這個事實,也不「翻」書,你就無法理解這個故事。