在C/C++中,如果一個多字節寬字符(wchar_t)值從大端系統傳輸到小端系統(反之亦然),它會在另一端出現相同的值?或者這些字節需要交換?wchar_t數據需要endian轉換嗎?
7
A
回答
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,它具有所有這些功能。
0
是的,你需要執行endian轉換。仔細定義您的序列化格式,即通過網絡傳輸或存儲在磁盤文件中的數據的字節順序。然後,在發送數據時,從本機轉換爲有線格式(可能需要或不需要字節交換),並且在接收數據時,將從有線轉換爲本地格式(可能需要也可能不需要字節交換)。您應該選擇一種將被大多數客戶端使用的連線格式,以最小化平均字節交換量。
5
Endian轉換是不夠的,因此不需要。 Sizeof(wchar_t)不同,因此也是編碼。因此,您需要就交換格式達成一致。邏輯選擇是UTF-8。但是由於UTF-8是面向字節的,所以你不再有字節碼問題。
相關問題
- 1. 我需要將char *(指針)轉換爲wchar_t *(指針)
- 2. C#Little-Endian轉換Java Big-Endian
- 3. 在c中轉換little endian爲big endian#
- 4. Wchar_t to string轉換
- 5. 需要JSON轉換爲數據表
- 6. 在C++中轉換long-endian?
- 7. XSLT轉換需要計數
- 8. 將float數組轉換成little/big endian
- 9. JSF2.0轉換器需要SelectItems嗎?
- 10. 我需要將NSUInteger轉換爲size_t嗎?
- 11. 轉換的char *至* wchar_t的
- 12. 將wchar_t轉換爲char C++
- 13. 將wchar_t轉換爲wstring
- 14. 將irr :: c8轉換爲wchar_t *
- 15. 從wchar_t轉換爲int
- 16. wchar_t轉換爲字符
- 17. 將wchar_t轉換爲int
- 18. 轉換爲wchar_t爲CHAR
- 19. 轉換爲wchar_t到CFStringref
- 20. 將wchar_t數組轉換爲PUNICODE_STRING
- 21. 將AWS RDS數據庫轉換爲InnoDB,數據庫「mysql」是否需要轉換?
- 22. 將數據包轉換爲結構的Endian問題
- 23. 如何將wchar_t *轉換爲char *而不會丟失數據?
- 24. 從使用big endian轉換爲little endian的過程有多快?
- 25. Perl:如何將big endian轉換爲little endian
- 26. 在AS3中將Little-endian ByteArray轉換爲Big-endian
- 27. 將32位變量以Big Endian順序轉換爲Little Endian
- 28. 在VBA中將big-endian轉換成little-endian,反之亦然
- 29. 我如何使用htonl將little endian轉換爲big endian
- 30. C - wchar_t打印不需要的字符
可能比總是將所有內容轉換爲網絡字節順序都要在網絡協議中包含一個字節順序標誌。這樣服務器可以發送其本地字節順序(減少服務器上的負載),客戶端可以確定是否需要轉換消息。 – 2009-01-08 10:28:52