简介:SMS的编码方式,在3GPP标准的3G TS 23.038和3G TS 23.040有详细的介绍,在本文中,只介绍SMS呈现给用户的内容的编码方式,即7bit和UCS2的编码方式。
1. 总体介绍
在3G TS 23.040中,9.2.2 PDU Type repertoire at SM-TL中,有介绍六种类型的SMS,其中五种都有TP-User-Data的域,这部分的呈现也就是我们看到的SMS内容。
在3G TS 23.038中,4 SMS Data Coding Scheme中,有如下信息:
<1>. SMS的三种编码方式,7bit、8bit和UCS2编码。8bit编码工作中很少遇到,也比较简单,这里不做说明。
<2>. TP-User-Data域的长度是140 octets。这140个字节如果保存7bit信息,最多可以保存160个7bit字符,如果保存UCS2编码,最多可以保存70个字符。
TP-User-Data包含的字符,除了SMS内容外,还有可能在开始的部分包含Header信息(由TP-UDHI来指示是否携带),Header信息占用的部分,是作为SMS控制使用的,不能呈现给用户。
2. 不带Header信息的7bit TP-User-Data
现在我发送一条短消息给手机,内容为I love you.,如果手机接收后是存在SIM卡上的,你可以在SIM的6F3C域(3G TS 11.11 10.5.3 EFsms(Short messages))查看该消息内容:
01 04 81 21 43 F5 00 0B 81 51 28 39 58 71 F1 00 00 21 11 90 50 03 80 00 0B 49 10 FB 6D 2F 83 F2 EF BA 0B
因为是接收到的信息,可以用3G TS 23.040 9.2.2.1 SMS-DELIVER type来帮助解析:
01 04 81 21 43 F5 00 //前面部分,可不关注,有需要的同学自行研究
0B 81 51 28 39 58 71 F1 //TP-OA,发送SMS的手机号码
00 //TP-PID
00 //TP-DCS, 3G TS 23.038里可以了解这里表示7bit编码方式
21 11 90 50 03 80 00 //TP-SCTS, 时间戳
0B //TP-User-Data-Length,这里为11个字符长度,也就是”I love you.”的字符个数
49 10 FB 6D 2F 83 F2 EF BA 0B//TP-User-Data
对TP-User-Data进行解析,7bit是压缩过的,这里要把11个7bit数据提取出来:
0x49:0100 1001 第一个字符,高位添0,就是0100 1001,0x49,7bit编码表为’I’
0x10:0001 0000 第二个字符,就是0010 0000,0x20,7bit编码表为’ ’
0xFB:1111 1011 第三个字符,就是0110 1100,0x6C,7bit编码表为’l’
0x6D:01101101 第四个字符,就是0110 1111,0x6F,7bit编码表为’o’
0x2F:0010 1111 第五个字符,就是0111 0110,0x76,7bit编码表为’v’
0x83:1000 0011 第六个字符,就是0110 0101,0x65,7bit编码表为’e’
0xF2:1111 0010 第七个字符,就是0010 0000,0x20,7bit编码表为’ ’
第八个字符,就是0111 1001,0x79,7bit编码表为’y’
0xEF:1110 1111 第九个字符,就是0110 1111,0x6F,7bit编码表为’o’
0xBA:1011 1010 第A个字符,就是0111 0101,0x75,7bit编码表为’u’
0x0B:0000 1011 第B个字符,就是0010 1110,0x2E,7bit编码表为’.’
上面的7bit编码表可以在3G TS 23.038 6.2.1 GSM 7 bit Default Alphabet查阅,看到这里大家就明白了如何把呈现给用户的内容从7bit的PDU数据里解析出来了。
3. 带Header信息的7bit TP-User-Data
上图用Now SMS发送下面消息给15829385171的手机,最终保存在SIM卡上的数据如下所示:
01 08 91 68 31 08 20 01 05 F0 44 0D 91 68 51 02 71 82 61 F4 00 D8 21 10 20 71 42 12 00 11 04 01 02 00 01 24 41 EC B7 BD 0C CA BF EB 2E
因为是接收到的信息,可以用3G TS 23.040 9.2.2.1 SMS-DELIVER type来帮助解析:
01 08 91 68 31 08 20 01 05 F0//前面部分,可不关注
44 //bit 6表示UDHI,这里bit6为1,则表明TP-User-Data有Header信息
0D 91 68 51 02 71 82 61 F4 //TP-OA
00 //TP-PID
D8 //TP-DCS, 3G TS 23.038里可以了解这里表示7bit编码方式
21 10 20 71 42 12 00 //TP-SCTS, 时间戳
11 //TP-User-Data-Length,这里为17个字符长度
04 01 02 00 01 24 41 EC B7 BD 0C CA BF EB 2E//TP-User-Data
对TP-User-Data进行解析:
04 01 02 00 01,04表示Header的长度为4个字节(不包含04本身),这里有5个字节,也就是说TP-User-Data的17个字节,包含了5个字节的Header信息,其余的部分为可呈现给用户的内容。
和上面不带Header信息的7bit TP-User-Data的内容同为”I love you.”,为什么这里除去Header后的TP-User-Data剩余部分,和上面不一致呢?
不带Header的”I love you.” 7bit编码: 49 10 FB 6D 2F 83 F2 EF BA 0B
带Header的”I love you.” 7bit编码: 24 41 EC B7 BD 0C CA BF EB 2E
原因是不带Header,则7bit是从第一个字节的第0位开始填充;而带Header的内容要和早期不允许带Header的7bit编码兼容,那么Header之后的部分,要留给bit位填充0值来padding保证兼容性。这里比较绕口,下面实例解释:
例如:这里Header的总长为5bytes,呈现给用户的数据时从第6bytes开始的,则第6bytes留出的bit位个数为:7 – (5*8%7) = 7 – 5 = 2
也就是说为兼容不带header信息的老版本:那么前面5个字节可以容纳5个7bit数据,并有5个bit位供下一个7bit数据使用,则第6个字节需要留出2bit和前面5bit组成一个7bit数据。
下面解析这部分内容:
0x24:0010 0100 这2个bit为padding位,用0填充
0x41:0010 0001 第一个字符,就是0100 1001,0x49,7bit编码表为’I’
第二个字符,就是0010 0000,0x20,7bit编码表为’ ’
0xEC:1110 1100 第三个字符,就是0110 1100,0x6C,7bit编码表为’l’
0xB7:1011 0111 第四个字符,就是0110 1111,0x6F,7bit编码表为’o’
0xBD:1011 1101 第五个字符,就是0111 0110,0x76,7bit编码表为’v’
0x0C:00001100 第六个字符,就是0110 0101,0x65,7bit编码表为’e’
0xCA:1100 1010 第七个字符,就是0010 0000,0x20,7bit编码表为’ ’
0xBF:1011 1111 第八个字符,就是0111 1001,0x79,7bit编码表为’y’
0xEB:1110 1011 第九个字符,就是0110 1111,0x6F,7bit编码表为’o’
第A个字符,就是0111 0101,0x75,7bit编码表为’u’
0x2E:0010 1110 第B个字符,就是0010 1110,0x2E,7bit编码表为’.’
4. 不带Header信息的UCS2 TP-User-Data
现在我发出一条短消息,内容为”我爱你。”,如果手机接收后是存在SIM卡上的,你可以在SIM的6F3C域(3G TS 11.11 10.5.3 EFsms(Short messages))查看该消息内容:
05 00 11 00 0B 81 51 28 39 58 72 F1 00 08 FF 08 62 11 72 31 4F 60 30 02
因为是接收到的信息,可以用3G TS 23.040 9.2.2.2 SMS-SUBMIT type来帮助解析:
05 00 11 00 //前面部分,可不关注,有需要的同学自行研究
0B 81 51 28 39 58 72 F1 //TP-OA,接收SMS的手机号码
00 //TP-PID
08 //TP-DCS, 3G TS 23.038里可以了解这里表示UCS2编码方式
FF //TP-VP
08 //TP-User-Data-Length,这里为8个字符长度,也就是”我爱你。”的2倍
62 11 72 31 4F 60 30 02 //TP-User-Data
对TP-User-Data进行解析,UCS2两个字节表示一个UCS2字符,组合如下:
0x6211,第一个字符,UCS2为“我”
0x7231,第二个字符,UCS2为“爱”
0x4F60,第三个字符,UCS2为“你”
0x3002,第四个字符,UCS2为“。”
查询Unicode编码(UCS2在这里可等同为Unicode,如要了解差别,可去外网查询相关文章了解)的方法如下:开始à程序à附件àTrueType造字程序,进入造字阶段后,选择:窗口à参照à输入编码就可以看到了。
5. 带Header信息的UCS2 TP-User-Data
上图用Now SMS发送下面消息给15829385171的手机,最终保存在SIM卡上的数据如下所示:
01 08 91 68 31 08 20 01 05 F0 44 0D 91 68 51 02 71 82 61 F4 00 E8 21 10 20 71 52 22 00 0D 04 01 02 00 01 62 11 72 31 4F 60 30 02
因为是接收到的信息,可以用3G TS 23.040 9.2.2.1 SMS-DELIVER type来帮助解析:
01 08 91 68 31 08 20 01 05 F0 44
0D 91 68 51 02 71 82 61 F4
00
E8 //TP-DCS, 3G TS 23.038里可以了解这里表示UCS2编码方式
21 10 20 71 52 22 00
0D //TP-User-Data-Length,这里为13个字符长度
04 01 02 00 01 62 11 72 31 4F 60 30 02//TP-User-Data
对TP-User-Data进行解析:
04 01 02 00 01,为Header部分
之后为可呈现给用户的数据部分:
62 11 72 31 4F 60 30 02
0x6211,第一个字符,UCS2为“我”
0x7231,第二个字符,UCS2为“爱”
0x4F60,第三个字符,UCS2为“你”
0x3002,第四个字符,UCS2为“。”