電話:0411-39105197
24小時熱線:13074143855
QQ:114836734
郵箱:114836734@qq.com地址:大連瓦房店北共濟街二段31號
晨暉服務 service
免費咨詢,免費檢測
恢復之前確定價格
可簽訂保密協議
數據恢復不成功不收費
不對源介質造成二次破壞
免費提供3天數據備份
免費上門取盤
節假日不休,7*24小時服務
文章來源:本站原創
發布日期:2015年05月10日大端、小端:
大小端是指CPU存儲數據的方式,比如一個0x01020304這個整數,在WIN、Linux下在內存中的布局如下
[01][02][03][04] 注意左邊是高地址,而右邊是低地址
在UNIX下則是
[04][03][02][01] 注意左邊是高地址,而右邊是低地址
通俗的說,和WIN下的內存布局一致的就是小端,和UNIX下一致的就是大端。
其實在以前還出現過中端的的機型,不過這些機型也太“孤僻”了,已經落伍沒人生產沒人用了。
網絡字節序:
其實是指網絡傳輸的字節序,這個字節序可能是大端序或者小端序,這取決于軟件開始時通訊雙方的協議規定。
平時,如果有人說的網絡字節序,那么大家就認為是大端序。
主機字節序:
是指主機處理數據時采用的字節序,雖然主機字節序和網絡字節序是相對的概念,但是我們說主機字節序的時候,并不默認是之大端或者小端,而是結合機型來確定大小端的。
位序:
我們通常所說的字節序是指字節之間的關系,但是即使是一個字節中的某一位(bIT)也是有排序的問題的。位序也有大端序,小端序,中端序,也還有其他的亂七八糟的位序的,但是都不常見。
開發的時候,我們是不用關心位序,編譯器和CPU會自己處理這些事情。
算術運算與內存操作運算:
算術運算是不改變被運算數據的字節序的,此時我們不用關心所操作的數據到底是什么字節序的。但是內存操作運算就要注意了,比若我們將一個整數指針強制轉換為一個字符指針類型,然后對字符指針類型的四個字節進行算數運算,此時我們必須知道是什么字節序。不然寫出的代碼要么是錯誤的,要么移植到其他機器的時候就不能正常運行。
常見的算術有+ - * / % & | ~ << >> = 等,請注意& | ~ << >> 這幾個是算術運算而不是內存操作運算,所以他們進行混合運算的時候不用關心字節序或者位序問題。賦值運算符僅在數據類型兼容的時候才不涉及字節序問題,才能算作算術運算。
常見的內存操作運算有:強制轉換后對碎片數據的算術運算,內存copy/write,讀寫文件等。
浮點數的字節序:
浮點數......我也不知道應該怎么處理其字節序問題,網上也查了很久但是沒有很權威的答案。對于浮點數,我建議不要直接傳內存值,按照字符串傳輸即可。
IP地址的字節序:
記住一條,IP地址的整數值,自IP地址生成的時刻起,就一定是網絡字節序的,所以我們在轉字節序的時候,IP 地址我們往往跳過對IP地址的字節序轉換。呵呵,IP地址已經是網絡字節序了,所以我們僅需要做算術賦值操作即可。
字節序轉換函數:
OS一般都提供htons、htonl、ntohs、ntohl這四個字節序操作函數,這些函數的目的雖然相同,而且操作后內存布局也相同,但是從算術運算的角度來看這些函數的特性是與機型相關的:在WIN下這四個函數會改變所操作的數的數值,但是在UNIX下就不回改變數據的算術值,UNIX下這些函數是空操作。這個差別也可能是為什么UNIX服務器上程序的性能會高于WIN的一個小原因。
更多精彩技術文章盡在 瓦房店數據恢復論壇:BBS.DLWFD.NET