8-bit,以及UCS2编码方式都可以理解,那么7-bit编码是怎么个情况呢。下面就慢慢解释吧。
以下是我收到的一条短信:(PDU模式)
0891683108701305F1240D91688176708816F600004160425153642304
将该短信内容拆分:
08
91
683108701305F1 //短信中心号码 13800731500 补‘F’凑成偶数个
24 //基本参数 无更多消息
0D //恢复地址数字个数 共13个十进制数(不包括91和‘F’) 十六进制
91
688176708816F6 //恢复地址 8618670788616 补F成偶数
00 //协议标识(TP-PID)是普通GSM类型 点到点方式
00 //用户信息编码 方式 (7-bit)
41604251616023 //时间戳
04 //用户信息长度 十六进制 (表示有四个字节)
31D98C06 //短信信息
OK,短信内容拆分完成,重要信息在上面已经标识出来,
一个就是告诉你短信内容编码方式:00表示7-bit默认编码方式 如果是08的话就表示是UCS2
另一个就是短信内容:31D98C06
目前来说光看以上短信内容是无法看出真正的短信内容(用户所发)的。
现在我们反向来分析一下7-bit编码。 其实以上真正的短信内容是"1234"
我们看一下该内容中每个字符的ASCII以及二进制信息:
字符: 1 2 3 4
ASCII: 0x31 0x32 0x33 0x34
二进制: 00110001 00110010 00110011 00110100
OK,下面聊一下7bit编码:
7bit编码实际上是一种压缩编码,因为ASCII码(不包括扩展的ASCII) 其值都是小于0x80的,也就是说其最高位为0,那么最高位信息也就是说没有意义的,可以被忽略。而7-bit编码也正是关注到了这一点,利用最高位也来存储数据,其编码时一次将下一7位编码的后几位逐次移到前面,形成了新的8位编码。
那么这样的话,回到我们的例子,也就是说ASCII字符可以使用7位编码
首先将所有字符转换成7位编码,即只要去除最高位就行:
1 2 3 4
0110001 0110010 0110011 0110100
现在需要将没个字节补齐,也就是补到8位,
首先将1补齐,将2的最后一位补到1前面:00110001 011001 0110011 0110100
将2补齐,将3的最后两位不到2前面: 00110001 11011001 01100 0110100
将3补齐,将4的最后补到3前面: 00110001 11011001 10001100 0110
最后将4补齐,在最前面不上四个0: 00110001 11011001 10001100 00000110
这个时候1234字符串的编码就变为了: 0x31 0xd9 0x8c 0x06 该值正好就是我们的短信内容!