7bit编码

原文来自点击打开链接


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  该值正好就是我们的短信内容!

你可能感兴趣的:(Android)