操作SIM卡中的數(shù)據(jù)操作主要有兩個地方,一個是短信操作,還有一個通訊錄操作,兩種編碼略有差別:
1、短信息操作:
在短信息中,默認(rèn)一條短信的最大長度為140個字節(jié)。
純ASCII字符主要采用7-bit編碼格式,即只是利用了字符的后7位數(shù)據(jù),這樣160個ASCII字符只占用140個字節(jié)。這樣我們手機(jī)的一條短信就可以發(fā)送160個ASCII字符了。
包含漢字的字符采用UCS2編碼格式,即UNICODE的2字節(jié)編碼格式。樣每個字符占用兩個字節(jié),只要短信中包含中文,整條短信的字符都要采用UCS2編碼,這樣一條短信最多就只能發(fā)送70個字符了。
2、通訊錄操作:
通訊錄中的姓名長度限制不一樣,本人使用的TD模塊限制長度為14個字節(jié)。
單獨的ASCII字符正常都使用8-bit編碼格式,即每個字節(jié)都占用8位,這也是最為正常的存儲格式了。
如果包含中文等字符,則正常采用80編碼格式,即整個姓名字符以80開頭,后面跟上UCS2數(shù)據(jù),但有些情況下又會采用81或者82開頭。
a) 80 開頭:
80開頭的為ucs2格式(注意:后面的字符必須有中文才行,否則可能是以80開頭的純ASCII字符串),大頭在前,小頭在后。
例1:中國
UNICODE編碼為:4E2D56FD
用ucs2的80方案表示是:804E2D56FD
例2:杜10娘
UNICODE編碼為:675C003100305A18
用ucs2的80方案表示是:80675C003100305A18
顯然只要有中文,數(shù)字也得占用兩個字節(jié)。
b) 81 開頭:
81開頭的格式中,包含一個基址(一個字節(jié))。有這個基址,就可以用一個字節(jié)表示一個ucs2字符了。
在格式上,81是標(biāo)識,后一個字節(jié)表示整個字符串長度,再后面一個字節(jié)是基址,再往后的就都是數(shù)據(jù)了。先舉一例:
例3:杜杜杜
UNICODE編碼為:675C675C675C
用ucs2的80方案表示是:80675C675C675C
用ucs2的81方案表示是:8103CEDCDCDC
分析一下UCS2的81方案:8103CEDCDCDC
81:為標(biāo)記
03:表示整個字符串為3個字符
CE:一個字節(jié)為基址。解析的方法為:將基址(CE)左移七位,并將最高位置為0,最低位再補(bǔ)一個0(這樣就16位啦)。此時基
址變?yōu)?x6700,然后再判斷后面的數(shù)據(jù)字節(jié)。
DCDCDC:3個數(shù)據(jù)字節(jié) DC, DC, DC 。如果數(shù)據(jù)字節(jié)的最高位為0,則認(rèn)為此字節(jié)是一個ASCII字符。如果數(shù)據(jù)字節(jié)的最高位為
1,則低7位為基址的一個偏移,實際的UCS2字符為基址加上這個偏移值。由于此處三個數(shù)據(jù)字節(jié)最高位都為1,則實際的3個字符的
偏移值為:5C, 5C, 5C。實際的UCS2編碼為: 0x675C 0x675C 0x675C, 此處我們就看的明白了。
例4:一丁丂七丄丅 (注:這些字符屬于GBK字符集)
UNICODE編碼為:4E004E014E024E034E044E05
用ucs2的80方案表示是:804E004E014E024E034E044E05
用ucs2的81方案表示是:81069C808182838485
分析一下UCS2的81方案:81069C808182838485
81:為標(biāo)記
06:表示整個字符串為6個字符
9C:一個字節(jié)為基址。解析的方法為:將基址(9C)左移七位,并將最高位置為0,最低位再補(bǔ)一個0(這樣就16位啦)。此時基址
變?yōu)?x4E00,然后再判斷后面的數(shù)據(jù)字節(jié)。
808182838485:6個數(shù)據(jù)字節(jié) 80,81,82,83,84,85 。由于此處六個數(shù)據(jù)字節(jié)最高位都為1,則實際的6個字符的偏移值為:00,
01,02,03,04,05。實際的UCS2編碼為:0x4E00,0x4E01,0x4E02,0x4E03,0x4E04,0x4E05。 OK。
c) 82 開頭:
82開頭的格式中,包含一個基址(兩個字節(jié))。有這個基址,就可以用一個字節(jié)表示一個ucs2字符了。
在格式上,81是標(biāo)識,后一個字節(jié)表示整個字符串長度,再后面兩個字節(jié)是基址,再往后的就都是數(shù)據(jù)了。先舉一例:
例5:8025EF芳
UNICODE編碼為:00380030003200350045004682B3
用ucs2的80方案表示是:8000380030003200350045004682B3
用ucs2的81方案表示是:(因為格式的限制,最多容納128個中文和127個英文,所以此處無法用81格式表示)
用ucs2的82方案表示是:82078280383032354546B3
分析一下UCS2的82方案:82078280383032354546B3
82:為標(biāo)記
07:表示整個字符串為7個字符
8280:兩個字節(jié)為基址。
383032354546B3:7個數(shù)據(jù)字節(jié) 38,30,32,35,45,46,B3。如果數(shù)據(jù)字節(jié)的最高位為0,則認(rèn)為此字節(jié)是一個ASCII字符。如果
數(shù)據(jù)字節(jié)的最高位為1,低7位為基址的一個偏移,實際的UCS2字符為基址加上這個偏移值。由于此處七個數(shù)據(jù)字節(jié)的前六個字節(jié)最高
位為0,所以表示6個ASCII字符0x38,0x30,0x32,0x35,0x45,即8,0,2,5,E,F。第七個字節(jié)的最高位為1,則此數(shù)據(jù)的
偏移值為0x33,需要加上基址 0x8280,UCS2編碼為0x82B3(芳)
例6:杜杜1
UNICODE編碼為:675C675C0031
用ucs2的80方案表示是:80675C675C0031
用ucs2的81方案表示是:8103CEDCDC31
用ucs2的82方案表示是:82036700DCDC31
分析一下UCS2的82方案:82036700DCDC31
82:為標(biāo)記
03:表示整個字符串為6個字符
6700:兩個字節(jié)為基址。
DCDC31:36個數(shù)據(jù)字節(jié) DC,DC,31。由于此處三個字節(jié)的前兩個字節(jié)最高位為1,則此數(shù)據(jù)的偏移值為0x5C,需要加上基址
0x6700,UCS2編碼為:0x675C(杜)。第三個字節(jié)的最高位為0,所以表示一個ASCII字符:0x31,即 1 。
此處只是稍微分析了一下UCS2三種格式(80,81,82)的解碼,想必知道了各個字段的含義,編碼也就輕松多了