按照上述關于MSB和LSB的意思,在二進制表達方式中,bit從0開始,從右向左,bit0為最低有效位,而bit23為最高有效位。而我們一般稱左邊的0x07為高位字節,0x15為低位字節。二、內存地址
再通俗一點解釋就是:8421碼的,8這端為高位,1這端為低位,相應的字節則分別稱為高位字節和低位字節。
| 字節序 | 內存地址 | int(16bit) | int(32bit) | 特點 |
| 小端 | 0x1001,0x1002,0x1003,0x1004 | 0x15 0xCD 0x5B 0x07 | 0x15 0xCD 0x5B 0x07 | 低地址端存儲低位字節,低位在前 |
| 大端 | 0x1001,0x1002,0x1003,0x1004 | 0xCD 0x15 0x07 0x5B | 0x07 0x5B 0xCD 0x15 | 低地址端存儲高位字節,高位在前 |
如果是做跨平臺開發時,雙方需要協商好字節序,然后根據程序運行的環境,確定是否需要字節序轉換。五、C#位操作符
例如約定的通訊字節序位Big Endian,默認的windows采用的Little Endian,那收到數據后就需要做轉換操作。
在使用GB2312的程序通常采用EUC儲存方法,以便兼容于ASCII。瀏覽器編碼表上的“GB2312”,通常都是指“EUC-CN”表示法。2、UTF-8
每個漢字及符號以兩個字節來表示。第一個字節稱為“高位字節”,第二個字節稱為“低位字節”。
“高位字節”使用了0xA1-0xF7(把01-87區的區號加上0xA0),“低位字節”使用了0xA1-0xFE(把01-94加上0xA0)。
由于一級漢字從16區起始,漢字區的“高位字節”的范圍是0xB0-0xF7,“低位字節”的范圍是0xA1-0xFE,占用的碼位是72*94=6768。其中有5個空位是D7FA-D7FE。
例如“啊”字在大多數程序中,會以兩個字節,0xB0(第一個字節)0xA1(第二個字節)儲存。(與區位碼對比:0xB0=0xA0+16,0xA1=0xA0+1)。
例如漢字”嚴”利用utf8編碼過程:3、Unicode
1、已知“嚴”的unicode編碼是4E25(100111000100101),根據utf8規則可以得知其utf8編碼需要三個字節。
即格式是“1110xxxx 10xxxxxx 10xxxxxx”
第一個字節前三位表示了字符“嚴”被編碼成utf8后的編碼長度,有多長,則從左開始填多少個1,如果只有1個字節,則第一個位為0。
對于編碼后大于1個字節的符號,第一個字節的第四位為0,其他字節前兩位均要求為10。
2、從”嚴“的最后一個二進制位開始,依次從后向前填入格式中的x,多出的位補0。這樣就得到了“嚴”的utf8編碼為“11100100 10111000 10100101”,轉換成十六進制就是E4B8A5。
編碼示例過程參考的原文:http://m.afoofa.cn/thread-1454-1-1.html
從上述過程可以看到,utf8的字節序已經由其編碼方案決定,不受CPU字節序影響。
Unicode規范中推薦的標記字節順序的方法是BOM。BOM不是“Bill Of Material”的BOM表,而是Byte Order Mark。BOM是一個有點小聰明的想法:
在Unicode編碼中有一個叫做”ZERO WIDTH NO-BREAK SPACE”的字符,它的編碼是FEFF。而FEFF在Unicode中是不存在的字符,所以不應該出現在實際傳輸中。UCS(Unicode的學名)規范建議我們在傳輸字節流前,先傳輸字符“ZERO WIDTH NO-BREAK SPACE”。
這樣如果接收者收到FEFF,就表明這個字節流是Big-Endian的;如果收到FFFE,就表明這個字節流是Little-Endian的。因此字符“ZERO WIDTH NO-BREAK SPACE”又被稱作BOM。
UTF-8不需要BOM來表明字節順序,但可以用BOM來表明編碼方式。字符“ZERO WIDTH NO-BREAK SPACE”的UTF-8編碼是EF BB BF。所以如果接收者收到以EF BB BF開頭的字節流,就知道這是UTF-8編碼了。
| 歡迎光臨 ELEOK (http://m.afoofa.cn/) | Powered by Discuz! X5.0 |