2013-05-09 37 views
0

我在下面的網絡比喻有點糊塗:字節表示 - 網絡原始數據

考慮我傳遞一個指針Winsock發送()函數序列化的結構(與整數)。

我的英特爾機器上,這些4個字節的整數可以在大端機器上用不同的方式來表示和誤解時,結構上的另一邊重新創建。

這是可以理解的,但一個問題 - 所以我想知道 - 如果那是什麼在兩臺機器上運行兩個程序被編譯爲32位?英特爾< - > AMD指令集不會像二進制文件那樣發生自動轉換嗎?

如果沒有辦法避免它 - 我怎麼會用,而不必這一問題通過網絡發送原始數據結構的工作嗎?

回答

0

你應該爲你選擇數據的網絡格式,這種格式指定每個字節(例如,你可以使用大尾數爲整數4個字節代表),然後寫轉換器/從這種格式爲每一種平臺的你程序運行在。

32/64位指令集,Intel/AMD的差異與此無關。

+0

那麼你的意思是像網絡字節順序? – 2013-05-09 12:55:21

+0

這正是他的意思。 – 2013-05-09 13:12:16

0

因爲不同體系結構的機器(不,Intel和AMD沒有足夠不同的體系結構)可能以不同的字節順序存儲數據。由於使用網絡的用戶希望他們的數據以一種可以理解的格式到達,無論是1990年的數字設備VAX,2005年的Sun Sparc還是1996年的AMD 486,2008年的iPhone(ARM)或2013年的Intel CoreX機器,網絡協議規定命令應該以某種方式。

自1980-1990年代以來,最常見的機器(至少可能連接到某種網絡的機器)恰好是「大端」,這是當時的選擇,當然,我們現在不能改變它,只是因爲時代已經改變了,因爲那需要刪除所有依賴於它的順序的現有代碼。

當然,如果您只使用您的軟件將數據發送到其他機器,那麼您可以按照自己喜歡的方式進行操作 - 這是您的數據,打包方法和軟件。只要兩端具有相同的使用順序的想法。如果你想發送數據到一個不是你自己的協議,那麼你需要遵循協議規定的字節順序。

它確實只是一個「自定義」的問題。我們必須有一個標準,否則我們不能在不同的基礎架構的機器之間發送數據。如果不同的製造商(或型號)根據「當時的感受」將制動踏板置於不同的位置,就會對大多數人開車時駕駛汽車的能力造成破壞 - 假設必須記住是否應該將腳在左側,中間或右側踏板走得慢些?