SIM卡联系人代码分析

本文详细介绍了SIM卡和USIM卡中ADN、FDN、SDN等联系人信息的存储格式,包括80、81、82开头的不同UCS2编码方式,以及BCD码的概念。同时,讨论了PBR(PhoneBookReferencefile)的结构和解析过程,包括A8、A9、AA等不同类型的TLV记录。文章还涉及了Android系统中如何读取和处理这些数据的相关代码片段。

1、SIM卡读取  ADN  SDN FDN        

ADN :Abbreviated Dialling numbers

FDN :Fixed Dialling numbers

SDN : Service Dialling Numbers

PBR : Phone Book Reference file

2、USIM卡读取 PBR SDN FDN

详见IccPhoneBookInterfaceManager.java

    protected int updateEfForIccType(int efid) {
          // Check if we are trying to read ADN records
          if (efid == IccConstants.EF_ADN) {
              if (mPhone.getCurrentUiccAppType() == AppType.APPTYPE_USIM) {
                  return IccConstants.EF_PBR;
              }
          }
          return efid;
      }

3、SDN格式 

Alpha indentifier 名字

如果包含中文等字符,则正常采用80编码格式,即整个姓名字符以80开头,后面跟上UCS2数据,但有些情况下又会采用81或者82开头。

80 开头:

80开头的为ucs2格式(注意:后面的字符必须有中文才行,否则可能是以80开头的纯ASCII字符串),大头在前,小头在后。

例1:中国 UNICODE编码为:4E2D56FD

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

例2:杜10娘

UNICODE编码为:675C003100305A18

用ucs2的80方案表示是:80675C003100305A18 显然只要有中文,数字也得占用两个字节

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

82 开头: 82开头的格式中,包含一个基址(两个字节)。有这个基址,就可以用一个字节表示一个ucs2字符了。 在格式上,81是标识,后一个字节表示整个字符串长度,再后面两个字节是基址,再往后的就都是数据了。先举一例:

例4: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(芳)

详见IccUtils.java

public static String
    adnStringFie
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值