2009-01-07 19 views

回答

9

是的,你需要交換它們。
字節將按照與輸入相同的順序從傳輸中檢索。只是在另一端,這些字節的排序有不同的含義。所以你需要將它們轉換成正確的字節序(這是一個字嗎?)。

經過驗證的方法是在傳輸之前轉換爲網絡字節順序。然後在收到時轉換回主機特定的字節順序(從網絡字節順序)。

一組功能,以幫助endian的轉換:

ntohs Convert a 16-bit quantity from network byte order to host byte order 
ntohl Convert a 32-bit quantity from network byte order to host byte order 
htons Convert a 16-bit quantity from host byte order to network byte order 
htonl Convert a 32-bit quantity from host byte order to network byte order 

只需添加另一個值得注意的問題。
不同的系統對wchar_t使用不同的大小,所以不要假設sizeof(wchar_t)== 2.

此外,每個主機可以使用wchar_t的不同表示格式。
爲了解決這個問題,大多數系統都將文本轉換爲已知的傳輸格式(UTF-8或UTF-16是不錯的選擇)。將文本轉換爲另一端的主機特定格式。

您可以看看IBM的icu,它具有所有這些功能。

+1

可能比總是將所有內容轉換爲網絡字節順序都要在網絡協議中包含一個字節順序標誌。這樣服務器可以發送其本地字節順序(減少服務器上的負載),客戶端可以確定是否需要轉換消息。 – 2009-01-08 10:28:52

0

是的,你需要執行endian轉換。仔細定義您的序列化格式,即通過網絡傳輸或存儲在磁盤文件中的數據的字節順序。然後,在發送數據時,從本機轉換爲有線格式(可能需要或不需要字節交換),並且在接收數據時,將從有線轉換爲本地格式(可能需要也可能不需要字節交換)。您應該選擇一種將被大多數客戶端使用的連線格式,以最小化平均字節交換量。

5

Endian轉換是不夠的,因此不需要。 Sizeof(wchar_t)不同,因此也是編碼。因此,您需要就交換格式達成一致。邏輯選擇是UTF-8。但是由於UTF-8是面向字節的,所以你不再有字節碼問題。