規避Mac下機器的大小位元組序問題

2021-07-01 19:28:08 字數 1145 閱讀 3863

位元組序的含義:大於乙個位元組型別的資料在記憶體中的存放順序。比如short 或者int在不同的位元組序儲存結果是不一樣的。

大字節序(big-endian):高位位元組排放在記憶體的低位址端,低位位元組排放在記憶體的高位址端

小字節序(little-endian):低位位元組排放在記憶體的低位址端,高位位元組排放在記憶體的高位址端

通過乙個簡單的程式來判定該系統是大字節序還是小字節序。

#include int main()
該段**的原理很簡單。int型別的1,在小字節序下最低位為1,在大字節序下,最高位為1。所以可以通過判斷最低位是否為0來確定該機器的位元組序是什麼。

經測試,在windows,macosx,linux等基於x86的機器上面測試,都是小字節序。

在各種常見編碼(gbk,utf-8,unicode)中,只有unicode會牽扯到位元組序這個概念,因為ucs-2是用short int儲存,ucs-4是用int儲存。

我來用下面這段**檢驗一下通過iconv工具做編碼轉化在不同的機器上的效果。

int main(int argc , char ** argv)

{ iconv_t conveter = iconv_open("ucs-2","gb18030");

if(conveter== iconv_t(-1)){

std::cout<<"encode convert not supported!"《例子很簡單,將gbk編碼的字串變成unicode編碼,看轉化後的效果是否跟機器的位元組序保持一致。經測試結果發現在macosx和linux下面結果有不同。linux 的結果是正常的,

0000000: 6100 6200 6300 6400 0000 0000 00 a.b.c.d……

但是在osx下面的結果卻是這樣:

0000000: 0061 0062 0063 0064 0000 0000 00 .a.b.c.d…..

為什麼會在兩個平台如此,具體原因沒有深究。但是這種表現會影響mac下面的轉化結果。在iconv時顯示的指明到底是ucs-2le還是ucs-2be,這樣在各個平台的處理結果是符合預期的,修改這麼一句:

iconv_t conveter = iconv_open("ucs-2le","gb18030");

機器的大小端

用c語言寫程式時需要知道是大端模式還是小端模式。所謂的大端模式 be big endian 是指資料的低位儲存在記憶體的高位址中,而資料的高位,儲存在記憶體的低位址中 低對高,高對高 最直觀的位元組序,因為不要考慮對應關係 只需要把記憶體位址從左到右按照由低到高的順序寫出,把值按照通常的高位到低位的...

大小端機器的判定

所謂的 大端模式 是指資料的低位 就是權值較小的後面那幾位 儲存在記憶體的高位址中,而資料的高位,儲存在記憶體的低位址中,這樣的儲存模式有點兒類似於把資料當作字串順序處理 位址由小向大增加,而資料從高位往低位放 所謂的小端模式 是指資料的低位儲存在記憶體的低位址中,而數 據的高位儲存在記憶體的高位址...

判斷機器的大小端

一 概念 大端模式 big endian 是指資料的低位儲存在記憶體的低位址中,而數 據的高位儲存在記憶體的高位址中。為什麼會有大小端模式之分呢?這是因為在計算機系統中,我們是以位元組為單位的,每個位址單元都對應著乙個位元組,乙個位元組為8bit。但是在c語言中除了8bit的char之外,還有16b...