SIM卡中UCS2編碼的三種格式(80,81,82)分析

網上看到一篇比較好的說ucs2編碼的文章,保存一下,原文地址:html

http://hi.baidu.com/youren4548/blog/item/fa08bd1bf61005058618bf1d.html
編碼

    操做SIM卡中的數據操做主要有兩個地方,一個是短信操做,還有一個通信錄操做,兩種編碼略有差異:spa

一、短信息操做:htm

    在短信息中,默認一條短信的最大長度爲140個字節。blog

    純ASCII字符主要採用7-bit編碼格式,即只是利用了字符的後7位數據,這樣160個ASCII字符只佔用140個字節。這樣咱們手機的一條短信就能夠發送160個ASCII字符了。字符串

    包含漢字的字符采用UCS2編碼格式,即UNICODE的2字節編碼格式。樣每一個字符佔用兩個字節,只要短信中包含中文,整條短信的字符都要採用UCS2編碼,這樣整個短信最多就只能發送70個字符了。get

二、通信錄操做:it

    通信錄中的姓名長度限制不同,本人使用的TD模塊限制長度爲14個字節。io

    單獨的ASCII字符正常都使用8-bit編碼格式,即每一個字節都佔用8位,這也是最爲正常的存儲格式了。方法

    若是包含中文等字符,則正常採用80編碼格式,即整個姓名字符以80開頭,後面跟上UCS2數據,但有些狀況下又會採用81或者82開頭。

  a) 80 開頭:

    80開頭的爲ucs2格式(注意:後面的字符必須有中文才行,不然多是以80開頭的純ASCII字符串),大頭在前,小頭在後。

    例1:中國

    UNICODE編碼爲:4E2D56FD

    用ucs2的80方案表示是:804E2D56FD

    例2:杜10娘

    UNICODE編碼爲:675C003100305A18

    用ucs2的80方案表示是:80675C003100305A18

    顯然只要有中文,數字也得佔用兩個字節。


   b) 81 開頭:

     81開頭的格式中,包含一個基址(一個字節)。有這個基址,就能夠用一個字節表示一個ucs2字符了。

     在格式上,81是標識,後一個字節表示整個字符串長度,再後面一個字節是基址,再日後的就都是數據了。先舉一例:

     例3:杜杜杜

     UNICODE編碼爲:675C675C675C

     用ucs2的80方案表示是:80675C675C675C

     用ucs2的81方案表示是:8103CEDCDCDC

     分析一下UCS2的81方案:8103CEDCDCDC

     81:爲標記

     03:表示整個字符串爲3個字符

     CE:一個字節爲基址。解析的方法爲:將基址(CE)左移七位,並將最高位置爲0,最低位再補一個0(這樣就16位啦)。此時基

     址變爲0x6700,而後再判斷後面的數據字節。

     DCDCDC:3個數據字節 DC, DC, DC 。若是數據字節的最高位爲0,則認爲此字節是一個ASCII字符。若是數據字節的最高位爲

     1,則低7位爲基址的一個偏移,實際的UCS2字符爲基址加上這個偏移值。因爲此處三個數據字節最高位都爲1,則實際的3個字符的

     偏移值爲:5C, 5C, 5C。實際的UCS2編碼爲: 0x675C 0x675C 0x675C, 此處咱們就看的明白了。

     例4:一丁丂七丄丅               (注:這些字符屬於GBK字符集)

     UNICODE編碼爲:4E004E014E024E034E044E05

     用ucs2的80方案表示是:804E004E014E024E034E044E05

     用ucs2的81方案表示是:81069C808182838485

     分析一下UCS2的81方案:81069C808182838485

     81:爲標記

     06:表示整個字符串爲6個字符

     9C:一個字節爲基址。解析的方法爲:將基址(9C)左移七位,並將最高位置爲0,最低位再補一個0(這樣就16位啦)。此時基址

     變爲0x4E00,而後再判斷後面的數據字節。

     808182838485:6個數據字節 80,81,82,83,84,85 。因爲此處六個數據字節最高位都爲1,則實際的6個字符的偏移值爲:00, 

     01,02,03,04,05。實際的UCS2編碼爲:0x4E00,0x4E01,0x4E02,0x4E03,0x4E04,0x4E05。 OK。

 

   c) 82 開頭:

     82開頭的格式中,包含一個基址(兩個字節)。有這個基址,就能夠用一個字節表示一個ucs2字符了。

     在格式上,81是標識,後一個字節表示整個字符串長度,再後面兩個字節是基址,再日後的就都是數據了。先舉一例:

     例5:8025EF芳

     UNICODE編碼爲:00380030003200350045004682B3

     用ucs2的80方案表示是:8000380030003200350045004682B3

     用ucs2的81方案表示是:(由於格式的限制,最多容納128箇中文和127個英文,因此此處沒法用81格式表示)

     用ucs2的82方案表示是:82078280383032354546B3

     分析一下UCS2的82方案:82078280383032354546B3

     82:爲標記

     07:表示整個字符串爲7個字符

     8280:兩個字節爲基址。

     383032354546B3:7個數據字節 38,30,32,35,45,46,B3。若是數據字節的最高位爲0,則認爲此字節是一個ASCII字符。若是

     數據字節的最高位爲1,低7位爲基址的一個偏移,實際的UCS2字符爲基址加上這個偏移值。因爲此處七個數據字節的前六個字節最高

     位爲0,因此表示6個ASCII字符0x38,0x30,0x32,0x35,0x45,即8025EF。第七個字節的最高位爲1,則此數據的

     偏移值爲0x33,須要加上基址 0x8280,UCS2編碼爲0x82B3(

     例6:杜杜1

     UNICODE編碼爲:675C675C0031

     用ucs2的80方案表示是:80675C675C0031

     用ucs2的81方案表示是:8103CEDCDC31

     用ucs2的82方案表示是:82036700DCDC31

     分析一下UCS2的82方案:82036700DCDC31

     82:爲標記

     03:表示整個字符串爲6個字符

     6700:兩個字節爲基址。

     DCDC31:36個數據字節 DC,DC,31。因爲此處三個字節的前兩個字節最高位爲1,則此數據的偏移值爲0x5C,須要加上基址

     0x6700,UCS2編碼爲:0x675C()。第三個字節的最高位爲0,因此表示一個ASCII字符:0x31,即 1 。


     此處只是稍微分析了一下UCS2三種格式(80,81,82)的解碼,想必知道了各個字段的含義,編碼也就輕鬆多了。
相關文章
相關標籤/搜索