在刚开始对7位编码长短信时,在网上看了很多资料,发现对这个都不太理解。做完后总结一下,希望对有点用处。
普通的7位压缩编码,我在这里不做过多描述。(23.040)
1. 我们大部分的思路就是按照短信头加7bits编码 如:
0051000B813167309125F10000FF0905000344020131D90C
这种方式就是基本的组合09=6+3 (6是头长度,3是字符个数,后面的数字将减去特别描述),你会发现这种方式会发送失败或者发送到另外的手机会显示乱码。
2. 我们先看看协议描述(图 23.040 协议 9.2.3.24(a) 看不到图的请看描述的协议文档图)
UDL表示所有长度,UDHL表示短信头长度,请大家注意到在UDH与UD中间包含一个Fill bits,而这个Fill bits就是一个关键点。8bits/UCS2编码的都没有这个Fill bits。
3. 050003440201头是没有问题的,但是它占用6*8 = 7*7 – 1 bits。相当于7个7bits字符加上1位偏移量。所以在我们编码是应该从这1位偏移量开始计算,即“123”在含有6个头字节的短信中编码应该为:62B219
1 : 0110001 -> 01100010 (偏移位)
2 : 0110010 -> 10110010
3 : 0110011 -> 00011001
而因为6个UDH占用7个字符那么正确的编码应该为:
0051000B813167309125F10000FF0A05000344020162B219
0A=7+3;
那么同样长短信第二条为:
0051000B813167309125F10000FF0A05000344020262B219
4. 同样当我们发带有端口号的长短信为
0051000B813167309125F10000FF0C0B0003440201050412345678
0B=头长度;00=长短信;05=带端口号;12345678=源、目的端口号,而0B0003440201050412345678总共12*8=14*7-2,那么偏移量为2; 那么移位后数据应该为:C46433
1: 0110001 -> 11000100 (偏移位)
2: 0110010 -> 01100100
3: 0110011 -> 00110011
那么正确的编码后数据应该为:
0051000B813167309125F10000FF110B0003440201050412345678C46433
同样长短信第二条可以为:
0051000B813167309125F10000FF110B0003440202050412345678C46433
5. 这样就介绍了7Bits编码包含短信头的信息编码方式,其他可以类似引伸扩展。