2011-01-20 31 views
-1

我看到一個關於堆棧溢出的問題,如何從一端轉換爲另一端。解決方案是這樣的:大端小端轉換

template <typename T> 
void swap_endian(T& pX) 
{ 
    char& raw = reinterpret_cast<char&>(pX); 
    std::reverse(&raw, &raw + sizeof(T)); 
} 

我的問題是。這個解決方案能夠正確地交換位嗎?它會以正確的順序交換字節,但不會交換位。

+4

爲什麼要交換位?:) – onemasse 2011-01-20 20:56:00

+0

效率極低,但通用... :-) – 2011-01-20 21:05:29

+0

可能的重複[How如何在C++中的big-endian和little-endian值之間進行轉換?](http://stackoverflow.com/questions/105252/how-do-i-convert-between-big-endian-and-little-endian-values -in-c) – lpapp 2013-11-17 21:19:12

回答

4

是的,因爲沒有必要交換位。

編輯: 字節順序對2字節或更多字節的寫入順序有影響。 Little Endian意味着最不重要的字節是第一位的,反之則是大端。

如果您收到一個由little endian系統編寫的big-eindian字節流,則沒有關於字節內最重要位的爭論。如果位順序受到影響,則無法可靠地讀取每個其他字節流(即使它只是簡單的8位ascii)。

由於文件系統(或網絡層)不知道您是否一次發送一個字節,或者如果您發送的是整數(例如(例如,)),因此無法自動確定2字節或更大的值。 )4個字節長。

如果您與另一個系統有直接的1位串行連接,您必須同意傳輸層上的小端或大端位排序。

1

「Endianness」一般指的是字節順序,而不是字節順序。在這種情況下,您不必顛倒位。

1

你是對的,那個函數只會交換字節順序,而不是單個的位。這通常足夠聯網。根據你的需要,你也可以找到htons()family of functions有用。

From Wikipedia

大多數現代計算機處理器同意位排序 「內部」 個人 字節(這並不總是 情況下)。這意味着,任何單字節 值將被讀出的相同的上幾乎 一個可以將其發送到任何計算機「。

2

大尾端VS小端本身涉及如何字節較大的單位內有序的,如一個int,long等等。一個字節中的位排序是一樣的。