SIM卡中UCS2编码的三种格式(80,81,82)分析
⽹上看到⼀篇⽐较好的说ucs2编码的⽂章,保存⼀下,原⽂地址:
操作SIM卡中的数据操作主要有两个地⽅,⼀个是短信操作,还有⼀个通讯录操作,两种编码略有差别:
1、短信息操作:
在短信息中,默认⼀条短信的最⼤长度为140个字节。
纯ASCII字符主要采⽤7-bit编码格式,即只是利⽤了字符的后7位数据,这样160个ASCII字符只占⽤140个字节。这样我们⼿机的⼀条短信就可以发送160个ASCII字符了。
包含汉字的字符采⽤UCS2编码格式,即UNICODE的2字节编码格式。样每个字符占⽤两个字节,只要短信中包含中⽂,整条短信的字符都要采⽤UCS2编码,这样整个短信最多就只能发送70个字符了。
2、通讯录操作:
通讯录中的姓名长度限制不⼀样,本⼈使⽤的TD模块限制长度为14个字节。
单独的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,即8,0,2,5,E,F。第七个字节的最⾼位为1,则此数据的偏移值为0x33,需要加上基址 0x8280,UCS2编码为0x82B3(芳)
例6:杜杜1
UNICODE编码为:675C675C0031
⽤ucs2的80⽅案表⽰是:80675C675C0031
⽤ucs2的81⽅案表⽰是:8103CEDCDC31
⽤ucs2的82⽅案表⽰是:82036700DCDC31
分析⼀下UCS2的82⽅案:82036700DCDC31
82:为标记
03:表⽰整个字符串为6个字符
数字转unicode编码6700:两个字节为基址。
DCDC31:36个数据字节 DC,DC,31。由于此处三个字节的前两个字节最⾼位为1,则此数据的偏移值为0x5C,需要加上基址 0x6700,UCS2编码为:0x675C(杜)。第三个字节的最⾼位为0,所以表⽰⼀个ASCII字符:0x31,即 1 。
此处只是稍微分析了⼀下UCS2三种格式(80,81,82)的解码,想必知道了各个字段的含义,编码也
就轻松多了。
版权声明:本站内容均来自互联网,仅供演示用,请勿用于商业和其他非法用途。如果侵犯了您的权益请与我们联系QQ:729038198,我们将在24小时内删除。
发表评论