查看完整版本: High Bytes and Low Bytes
頁: [1]

ming2348381 發表於 2015-10-22 06:15 PM

High Bytes and Low Bytes

其實對這個有點似懂非懂
因此想請教一下

假設環境是android and windows

android的是 High bytes
windows的是 Low bytes

若直接將值轉成byte透過TCP丟到另一個系統去

就目前我的實驗結果
int long 數值之類的值,需要轉換High or Low否則值會錯誤
字串之類串流資料,都可以直接丟直接用

請問不同平台互丟資料,除了數值類的
還有丟什麼資料需要特別注意High or Low的呢?

<div></div>

chevylin0802 發表於 2015-10-23 08:51 AM

本帖最後由 chevylin0802 於 2015-10-23 09:12 AM 編輯

這其實不是跟平台有關的
通信協議是要自己去規範的

這回到最原始曾經提及過的問題
CPU

x86的架構關於整數在記憶體上的存取定義
與其它不同架構的CPU是不一樣的

所有正規的網路通信協議上
對於超過一個byte的定義方式採取的都是LSO
也就是俗稱的Little Endian
Low Byte會排在最前面 High Byte會排在最後面

通信協議規格是固定的
而x86系統只能再靠自己內部再轉
因為x86系統關於超過1個byte的存取方式是把High Byte排在前面
所以讀封包與寫封包的時候
x86系統都需要事先進行格式上的處理

C/C++就相對比較簡單點
可以用同一份原始碼
其他的程式語言就變得複雜一些
可能要兩種不同的程式碼版本
但是這麼一來也變成了另一種麻煩

有的方式為了簡化起見
就把封包處理的部份用JNI來寫
那麼原始碼就可以共用同一份
因為C/C++可以在編譯器使用者自定義下去編譯成x86與其他架構CPU的不同的目的碼

而另一種做法則是
比較簡單的方式
不要去考慮它的byte order
而是把要傳的數值先列印成字串
用字串傳送與接收
字串就不會有CPU架構不同的問題

除此之外
最多的狀況就是再把字串進行加密

但是就我所知
大部份公開的做法仍然就是以字串的方式做

只有少數的例外
比如封包表頭裏需要有counter或timestamp的
那麼就一定會用數值傳送
那種仍然維持固定的方式
一律都採行Low Byte Order的安排方式
並不會採取x86系統獨有的High Byte Order
畢竟全世界需要靠網路通信的設備與裝置很多
x86就主要只有在電腦與筆電上的應用為主
要比族群多寡來看
那麼x86確實還真的佔的比例並不高


...<div class='locked'><em>瀏覽完整內容,請先 <a href='member.php?mod=register'>註冊</a> 或 <a href='javascript:;' onclick="lsSubmit()">登入會員</a></em></div>

ming2348381 發表於 2015-10-27 09:58 AM

我不確定是不是我的理解有錯誤
我找了滿多資料,大部分是說網路採用 high(big endian)
而x86是 low(little endian )


頁: [1]