Calvin's Tech Space

          成于堅忍,毀于浮躁

             :: 首頁 :: 聯系 :: 聚合  :: 管理
          所有網絡協議都是采用big endian的方式來傳輸數據的。所以有時我們也會把big endian方式稱之為網絡字節序。當兩臺采用不同字節序的主機通信時,在發送數據之前都必須經過字節序的轉換成為網絡字節序后再進行傳輸。

          ???判斷小端還是大端規則的方法:

          int x = 1;
          if(*(char *)&x == 1)//取x指針強制轉換為char*類型再取值,此時取到的值是int最低字節值
          ????printf(“little-endian\n”);
          else
          ????printf(“big-endian\n”);

          ????另外補充:

          1.BIG-ENDIAN、LITTLE-ENDIAN、跟CPU有關的,每一種CPU不是BIG-ENDIAN就是LITTLE- ENDIAN、。IA架構的CPU中是Little-Endian,而PowerPC 、SPARC和Motorola處理器。這其實就是所謂的主機字節序。而網絡字節序是指數據在網絡上傳輸時是大頭還是小頭的,在Internet的網絡字 節序是BIG-ENDIAN。所謂的JAVA字節序指的是在JAVA虛擬機中多字節類型數據的存放順序,JAVA字節序也是BIG-ENDIAN。

          2.所以在用C/C++寫通信程序時,在發送數據前務必用htonl和htons去把整型和短整型的數據進行從主機字節序到網絡字節序的轉換,而接 收數據后對于整型和短整型數據則必須調用ntohl和ntohs實現從網絡字節序到主機字節序的轉換。如果通信的一方是JAVA程序、一方是C/C++程 序時,則需要在C/C++一側使用以上幾個方法進行字節序的轉換,而JAVA一側,則不需要做任何處理,因為JAVA字節序與網絡字節序都是BIG- ENDIAN,只要C/C++一側能正確進行轉換即可(發送前從主機序到網絡序,接收時反變換)。如果通信的雙方都是JAVA,則根本不用考慮字節序的問 題了。


          轉自http://www.embest.net/index.php/archives/259

          posted on 2011-11-15 15:36 calvin 閱讀(939) 評論(0)  編輯  收藏 所屬分類: C
          主站蜘蛛池模板: 新平| 凌源市| 手机| 阿拉善右旗| 宝清县| 化州市| 长泰县| 合阳县| 辽宁省| 南乐县| 金乡县| 安溪县| 高淳县| 社旗县| 武乡县| 曲松县| 亳州市| 景泰县| 益阳市| 海林市| 松潘县| 娱乐| 民县| 勐海县| 新巴尔虎左旗| 腾冲县| 故城县| 宜城市| 定日县| 东乡族自治县| 洞头县| 富顺县| 庆城县| 德钦县| 若尔盖县| 阆中市| 平顶山市| 济源市| 武乡县| 平凉市| 西平县|