IMSI的相关转换

参考cdma协议:IS2000_5BV

 

有时候卡商会参与一些测试,而测试的时候一般都是由测试方提供一个IMSI号刷到UIM卡里面,这就牵扯到把数字格式的IMSI转换成CDMA2000文件系统6F22(EF_IMSI_M)中要求的格式。

貌似网上介绍的中文资料不多,这里就带着例子写一下

6F22格式:

00 AA AA BB BB BB CC 80 DD DD

00代表CLASS=0

AA AA根据MIN前3位计算

BB BB BB根据MIN后7位计算

CC根据MNC计算

80代表IMSI_M_PROGRAMMED=1、IMSI_M_ADD_NUM=0

DD DD根据MCC计算

参照CDMA2000协议中6F22的格式,第1个字节和第7个字节都好搞定,基本就是标志位的设置。

其余工作在于剩下的几个字节怎么编码。

计算AA AA步骤

1、以MIN的前3位为计算数据,分割成3个个位数,分别命名为D1、D2、D3

2、计算数字NUM = D1 * 100 + D2 * 10 + D3 - 111(如D1、D2、D3中出现0,则当作10计算)

3、将NUM转换为2字节小端格式16进制,位数不足在前面用0补。AA AA计算完毕

计算BB BB BB步骤

1、以MIN第4-6位为数据,按照AA AA的计算步骤1、2算出NUM,将NUM转换为10bit的2进制,不足用0补

2、将MIN第7位单独取出来,按照标准10进制转2进制的计算方法,计算出4bit的2进制,不足用0补(修正:如果是0,按照10计算)

3、以MIN第8-10位为数据,按照AA AA的计算步骤1、2算出NUM,将NUM转换为10bit的2进制,不足用0补

4、将前3步的计算出来的共24bit的2进制数拼起来,转换成3字节小端格式16进制数。BB BB BB计算完毕

计算CC步骤

1、将MNC分割成2个个位数,分别命名为D1、D2

2、计算数字NUM = D1 * 10 + D2 - 11(如D1、D2中出现0,则当作10计算)

3、将NUM转换为1字节16进制。CC计算完毕

计算DD DD步骤

1、以MCC为数据,按照AA AA的计算方法,计算出2字节小端格式16进制,即为DD DD

例子:

已知IMSI号:460036591141482

此IMSI中:

MCC是460

MNC是03

MIN是6591141482

计算AA AA

MIN前3位659,NUM = 6 * 100 + 5 * 10 + 9 - 111 = 548 转换成2字节小端格式16进制为:24 02

计算BB BB BB

MIN第4-6位114,NUM = 1 * 100 + 1 * 10 + 4 - 111 = 3 转换成10bit的2进制为:0000000011

MIN第7位1,转换为4bit的2进制为:0001

MIN第8-10位482,NUM = 4 * 100 + 8 * 10 + 2 - 111 = 371 转换成10bit的2进制为:0101110011

24bit的2进制数为:000000001100010101110011,转换成3字节小端格式16进制为:73 C5 00

计算CC

MNC为03,NUM = 10 * 10 + 3 - 11 = 92,转换成1字节16进制为5C

计算DD DD

MCC为460,NUM = 4 * 100 + 6 * 10 + 10 - 111 = 359 转换成2字节小端格式16进制为:67 01

至此得到6F22文件内容应为

00 24 02 73 C5 00 5C 80 67 01

 

你可能感兴趣的:(c,工作,测试,Class)