搜尋

首頁  >  問答  >  主體

c++ - TCP网络编程一般都是怎么封包解包的? 怎么才能解决不同平台的字节序和不同整数大小的问题?

unp里讲到不同平台传输二进制会因为字节序或者位数不同的问题产生问题,那应该怎么解决这个问题呢? 新手。。。求大神提供点这方面的资料。。。 还有为什么传字符串就不会有问题呢? 不会有问题的是一个字节的字符吧。。比如ASCII码,一个字符只占一个字节那不会有字节序问题,那要传多字节字符呢?比如传输中文 大端小端存储的也不一样吧? 难道不会有问题?

天蓬老师天蓬老师2803 天前771

全部回覆(4)我來回復

  • 阿神

    阿神2017-04-17 13:19:01

    統一小端就行了. 雖然網絡字節序都是大段. 但是, 但是, 目前最流行的設備, 也就是x86, 是小端的, 然後那些大端的機器, 同時也支持小端. 像arm, powerpc都是支援小端的. 所以不要管, 就小端.

    回覆
    0
  • PHPz

    PHPz2017-04-17 13:19:01

    字節序一般是對數字而言的,字串中編碼就定義了位元組的順序,所以使用相同的字串編碼就確定了它相同的位元組順序。而數字的字節序是歷史問題,目前都還沒統一,要處理數字字節序的問題也很簡單,不要用系統預設的數字寫入或讀取方式去讀取資料(因為這樣採用的是預設的字節序),而是自己透過程式將數字拆成大端或小端的數個字節,在讀取時也是手動組合大端或者小端的數據,這樣就保證了讀寫有統一的字節序。

    回覆
    0
  • 阿神

    阿神2017-04-17 13:19:01

    寫的時候指定Big-Endian或Little-Endian,讀的時候用相同的順序。

    回覆
    0
  • PHP中文网

    PHP中文网2017-04-17 13:19:01

    字節序的本質問題是兩個位元組以及以上的類型值的問題,網路傳輸資料的時候是二進位流,資料發送時什麼樣,接收時還是什麼樣,如果在socket兩端的機器大小端相同,或沒有兩個位元組以上的資料(就像字串都是單一位元組組成的數據,但是如果struct裡麵包含了多位元組資料就需要轉換了),網路字節序便沒什麼用,只有socket兩端的機器大小端不一樣,他們對於二進位資料例如0x1234的理解才不一樣,所以你需要呼叫hton*那一系列的函數進行對應的轉換才能得到正確的資料。

    回覆
    0
  • 取消回覆