2014-02-27 76 views
2

我正在從網絡接收一個緩衝區,這是一個大端,我在一個小端系統。在我的系統上使用它之前,是否必須將緩衝區反轉?我不確定字節序是否僅顛倒單個類型的字節排序,或者是否也適用於整個緩衝區。Endianness是否會顛倒數組?

例如,假設我從網絡接收到一個unsigned long s的緩衝區,而且我在一個小端系統上。該代碼將是這樣的:

for(int i=0;i<size;i++) 
    system_buffer[i]=ntohl(network_buffer[i]); 

以前我用system_buffer,我也有扭轉它(所以最後一個元素變爲第一個元素,反之亦然)?

reverse_buffer(system_buffer); 

此外,如果我接收unsigned char秒的陣列,還需要一種用於端序補償在所有,或我可以使用緩衝液作爲-是?

謝謝!

+4

閱讀此:http://commandcenter.blogspot.co.uk/2012/04/byte-order-fallacy.html – this

回答

3

Endianess僅適用於單個變量,
即。只針對每個數組元素值,而不是數組中元素的順序。

而1字節變量不能顛倒它們的字節順序,所以不需要對它們做任何事情。

1

字節順序隻影響大於一個字節的整數字節順序(即它不影響一個字節或int8_t)。

您需要按照字節順序讀取協議描述整數。

1

字節順序隻影響數據字中的字節順序(不是位)。由於char的大小始終爲1個字節,因此不必對它們進行任何調整。標準庫函數ntohl將網絡字節順序(n)的無符號整數(l)的字節順序更改爲主機字節順序(h)。因此,在使用它之前,您不需要反轉緩衝區。您只需要更改緩衝區中每個元素的字節順序。

for(int i = 0; i < size; i++) { 
    // network byte order to system byte order 

    system_buffer[i] = ntohl(network_buffer[i]); 
} 

// process system_buffer