簡體   English   中英

本地主機上的網絡字節順序

[英]Network byte order on localhost

我正在使用Winsock API開發網絡應用程序。 每當我測試應用程序以在數組中發送一些字節為例:

char[0] = '1';
char[1] = '2';
char[2] = '3';
char[3] = '4';
char[4] = '\0';

我使用sendrecv套接字接收在本地主機上運行的另一個應用程序上的字節,然后字節順序似乎根本沒有改變。 僅僅是因為我正在本地服務器上對其進行測試嗎? 網絡字節順序會更改為:

char[0] = '\0';
char[1] = '4';
char[2] = '3';
char[3] = '2';
char[4] = '1';

如果我通過互聯網收到它?

8位字符數組和字符串不會遇到網絡字節順序問題。 由於數組中的每個字符都已經按照自身順序排列,並與數組中的下一個字符字節進行排序...會影響到short,int和long。

同樣,不是send和recv調用可以進行任何字節交換。 字節交換與處理器如何在內存中布置整數有關:

要了解字節順序問題,請考慮以下英特爾芯片上的代碼:

// code that demonstrates how integer values are laid out in memory
int msg = 0x01020304;
char* buffer = (char*)&msg;
for (int x = 0; x < 4; x++)
    printf("%d %d %d %d\n", buffer[0], buffer[1], buffer[2], buffer[3]);

打印出來的結果是:

4 3 2 1

這表明x86處理器以與您期望的相反的順序對整數的內存字節進行排序。 最低有效字節或整數首先在內存中排序。 這是Little Endian。

在Sparc芯片(例如舊的Sun工作站)上,將輸出相同的代碼:

1 2 3 4

這是Big Endian。

只有當您將數據寫到磁盤或網絡上時,存儲順序的字節順序才重要。 一旦另一台計算機讀取了另一台計算機寫出的字節序列,則讀取整數的CPU將根據其自身的字節序對其進行解釋。

當將整數寫入文件或流式傳輸到網絡時,字節序通常很重要。 在沒有應用程序開發人員進行轉換的情況下,傳遞給send()的原始緩沖區將完全按照處理器將字節分配到內存中的方式進行傳輸。 有關將整數和短褲與Big Endian(又稱為網絡字節順序)之間進行轉換的更多詳細信息,請參見htonl和其朋友。

僅當您查看字節流並決定解釋數據時,字節順序才起作用。

例如,如果您有字節流:

'1' '2' '3' '4' '0'

然后,您決定將數據解釋為字符流,然后假設每個字符一個字節,您將獲得一個包含字符串“ 1234”的數組。

但是,如果您決定將數據解釋為int那么字節序就會發揮作用,因為您已經使用了多個字節來對數據類型(int)進行編碼。 上面的流的值具有十六進制值:

0x31 0x32 0x33 0x34 0x00

(0x31是“ 1”的十六進制值,依此類推)

這是字節序起作用的地方。 您需要知道流中數據的字節順序,以便在反序列化時可以成功地將其轉換回正確的值。

暫無
暫無

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

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