关于短信内容格式及压缩方法
author: scruffybear
release time: 29/08/2007
如有转载,请注明出处,并保持文章的完整性,谢谢!
七月份做警务通的项目,涉及到对已有的短信内容进行修改的问题,也就是所说的对COS打补丁修改短信内容的问题,联系本项目在这里对G网短信和C网短信的格式和压缩方法进行简单介绍。
1,G网短信的一般格式
G网短信格式完全遵守《GSM03.40规范》,所以很容易通过现有规范对现有短信进行解析。卡片按照《GSM11.14规范》来组织短信,发送短信的command tag为‘13’,SMS TPDU tag为‘0B/8B’,更详细内容请参见该规范,现用一条具体短信解释格式如下:
Fetch指令取得短信内容:
A01200002FSWD02D81030A130082028183850D8077ED4FE153D190014E2D20268B13010008819494881100080812345678123456789000
Command Details 01/81 03 0A(Command number) 13(command tag) 00(Command Qualifier) 此项是强制的(Mandatory)
Device identities 02/82 02 81(SIM) 83(Network) 此项是强制的(Mandatory)
Alpha identifier 05/85 0D 8077ED4FE153D190014E2D2026(短信发送中…) 此项应该是可选的(Optional)
Address tag 此例中没有,举例:06/86 08FFFFFFFFFFFFFFFF 此项应该是可选的(Optional)
SMS TPDU tag 0B/8B 13 01000881949488110008081234567812345678(此项内容在GSM03.40规范中解释)
SMS TPDU内容由《GSM03.40规范》进行解释,具体可参见该规范9.2节,Service Provided by the SM-TL(The Short Message Transfer Layer),现仅对具体本条短信的TPDU进行解释,内容如上:0B/8B 13 01000881949488110008081234567812345678,此短信为SUBMIT类型:
TP-MTI(TP-Message-Type-Indicator)等, 01,bit1,bit0最低两位为01,表示短信内容为SMS-SUBMIT (in the direction MS to SC),bit4,bit3为00,表示短信中无TP-VP字段:0 0 TP-VP field not present
TP-MR(TP-Message-Reference) 00
TPDA(TP-Destination-Address) 088194948811,TPDA的长度为(len+1)/2+1,在本例中,为(8+1)/2+1=5
TP-PID(TP-Protocol-Identifier) 00
TP-DCS(TP-Data-Coding-Scheme) 08
TP-VP(TP-Validity-Period) 此短信中无,该项表示短信的有效期。
TP-UDL+TPUD(TP-User-Data-Length+TP-User-Data) 081234567812345678
注意:TPUDL长度为实现压缩前的长度。
以上说明针对具体短信,更多情况请参照相应规范,在此不赘述。
2,G网短信的压缩及汇编实现
由于补丁中需要对G网短信做压缩,而且不方便调用已有函数,故用汇编实现了G网的短信压缩。
G网短信压缩格式在TP-DCS中指示,TP-DCS在《GSM03.38》中有说明,一般都采用将7bit编码压缩成8bit编码方式,这种压缩方式也在《GSM03.38》中有详细说明。
压缩编码方式将8字节的7bit编码压缩成7字节的8bit编码,也就是说160字节长短信可以压缩为140字节的短信,压缩了20字节,具体压缩方法如下:
原始的8字节未压缩编码如下:
- bits number:
6 5 4 3 2 1 0
1a 1b 1c 1d 1e 1f 1g
2a 2b 2c 2d 2e 2f 2g
3a 3b 3c 3d 3e 3f 3g
4a 4b 4c 4d 4e 4f 4g
5a 5b 5c 5d 5e 5f 5g
6a 6b 6c 6d 6e 6f 6g
7a 7b 7c 7d 7e 7f 7g
8a 8b 8c 8d 8e 8f 8g
经过压缩后的8bit编码如下:
- eight characters in seven octets:
- bits number:
7 6 5 4 3 2 1 0
2g 1a 1b 1c 1d 1e 1f 1g
3f 3g 2a 2b 2c 2d 2e 2f
4e 4f 4g 3a 3b 3c 3d 3e
5d 5e 5f 5g 4a 4b 4c 4d
6c 6d 6e 6f 6g 5a 5b 5c
7b 7c 7d 7e 7f 7g 6a 6b
8a 8b 8c 8d 8e 8f 8g 7a
从以上的压缩方法可以看出,第一个压缩后字节是第一个7bit在最高位加上第二个7bit的最低位,第二个压缩字节是第二个7bit的高六位加上第三个7bit的低两位,依次类推。 第七个压缩后字节(最后一个压缩字节)是第七个7bit的最高位加上整个第八个7bit的七位。这样就实现了将8个字节的7bit编码压缩成7个字节的8bit编码。
举一个具体的例子,字符串3132333435363738是7bit编码,现压缩成8bit编码。
3132333435363738转换为bit为00110001(31) 00110010(32) 00110011(33) 00110100(34) 00110101(35) 00110110(36) 00110111(37) 00111000(38),进行转换,过程如下:
a,转换31,32的最低位到31的最高位,可以看到31不变,第一个压缩后字节为31
b,转换32,32由于取了最低位,相当于向右移了一位,为00011001,将33的低两位放在右移一位的31高位上,也就为11011001,即D9。
c,转换33,33由于取了低两位,相当于向右移了两位,为00001100,将34的低三位放在右移两位的33高位上,也就为10001100,即8C。
d,转换34,34由于取了低三位,相当于向右移了三位,为00000110,将35的低四位放在右移三位的34高位上,也就为01010110,即56。
e,转换35,35由于取了低四位,相当于向右移了四位,为00000011,将36的低五位放在右移四位的35高位上,也就为10110011,即B3。
f,转换36,36由于取了低五位,相当于向右移了五位,为00000001,将37的低六位放在右移五位的36高位上,也就为11011101,即DD。
g,转换37,37由于取了低六位,相当于向右移了六位,为00000000,将整个38的七位放在右移六位的37高位上,也就是1110000,即70。
到此7位编码的3132333435363738压缩为了7字节的31D98C56B3DD70,也就是说压缩掉了一字节。
在进行编码实现时,可以将压缩前的短信每8字节为一组进行处理,处理为压缩后的七字节,这样形成外层循环。循环次数为短信长度除以8再向上取整,例如11/8=1, 1+1 = 2,也就是经过两次循环。进行内层循环处理时,需要进行七次循环,循环到n(0<n<8)次时,首先将当前字节右移n-1位,取后一字节的低n位,放在当前字节右移n-1位后的高n位,这样就可以完成对8字节的压缩,进而完成对整个短信的压缩。
由于涉及到很多相关的前后环境变量的处理,这里仅列出汇编实现的框架(此处为标准51汇编,双DPTR)如下:
![](http://images.csdn.net/syntaxhighlighting/OutliningIndicators/None.gif)
![](http://images.csdn.net/syntaxhighlighting/OutliningIndicators/None.gif)
![](http://images.csdn.net/syntaxhighlighting/OutliningIndicators/None.gif)
![](http://images.csdn.net/syntaxhighlighting/OutliningIndicators/None.gif)
![](http://images.csdn.net/syntaxhighlighting/OutliningIndicators/None.gif)
![](http://images.csdn.net/syntaxhighlighting/OutliningIndicators/None.gif)
![](http://images.csdn.net/syntaxhighlighting/OutliningIndicators/None.gif)
![](http://images.csdn.net/syntaxhighlighting/OutliningIndicators/None.gif)
![](http://images.csdn.net/syntaxhighlighting/OutliningIndicators/None.gif)
![](http://images.csdn.net/syntaxhighlighting/OutliningIndicators/None.gif)
![](http://images.csdn.net/syntaxhighlighting/OutliningIndicators/None.gif)
![](http://images.csdn.net/syntaxhighlighting/OutliningIndicators/None.gif)
![](http://images.csdn.net/syntaxhighlighting/OutliningIndicators/None.gif)
![](http://images.csdn.net/syntaxhighlighting/OutliningIndicators/None.gif)
![](http://images.csdn.net/syntaxhighlighting/OutliningIndicators/None.gif)
![](http://images.csdn.net/syntaxhighlighting/OutliningIndicators/None.gif)
![](http://images.csdn.net/syntaxhighlighting/OutliningIndicators/None.gif)
![](http://images.csdn.net/syntaxhighlighting/OutliningIndicators/None.gif)
![](http://images.csdn.net/syntaxhighlighting/OutliningIndicators/None.gif)
![](http://images.csdn.net/syntaxhighlighting/OutliningIndicators/None.gif)
![](http://images.csdn.net/syntaxhighlighting/OutliningIndicators/None.gif)
![](http://images.csdn.net/syntaxhighlighting/OutliningIndicators/None.gif)
![](http://images.csdn.net/syntaxhighlighting/OutliningIndicators/None.gif)
![](http://images.csdn.net/syntaxhighlighting/OutliningIndicators/None.gif)
![](http://images.csdn.net/syntaxhighlighting/OutliningIndicators/None.gif)
![](http://images.csdn.net/syntaxhighlighting/OutliningIndicators/None.gif)
![](http://images.csdn.net/syntaxhighlighting/OutliningIndicators/None.gif)
![](http://images.csdn.net/syntaxhighlighting/OutliningIndicators/None.gif)
![](http://images.csdn.net/syntaxhighlighting/OutliningIndicators/None.gif)
![](http://images.csdn.net/syntaxhighlighting/OutliningIndicators/None.gif)
![](http://images.csdn.net/syntaxhighlighting/OutliningIndicators/None.gif)
![](http://images.csdn.net/syntaxhighlighting/OutliningIndicators/None.gif)
![](http://images.csdn.net/syntaxhighlighting/OutliningIndicators/None.gif)
![](http://images.csdn.net/syntaxhighlighting/OutliningIndicators/None.gif)
![](http://images.csdn.net/syntaxhighlighting/OutliningIndicators/None.gif)
![](http://images.csdn.net/syntaxhighlighting/OutliningIndicators/None.gif)
![](http://images.csdn.net/syntaxhighlighting/OutliningIndicators/None.gif)
![](http://images.csdn.net/syntaxhighlighting/OutliningIndicators/None.gif)
![](http://images.csdn.net/syntaxhighlighting/OutliningIndicators/None.gif)
![](http://images.csdn.net/syntaxhighlighting/OutliningIndicators/None.gif)
![](http://images.csdn.net/syntaxhighlighting/OutliningIndicators/None.gif)
![](http://images.csdn.net/syntaxhighlighting/OutliningIndicators/None.gif)
![](http://images.csdn.net/syntaxhighlighting/OutliningIndicators/None.gif)
![](http://images.csdn.net/syntaxhighlighting/OutliningIndicators/None.gif)
![](http://images.csdn.net/syntaxhighlighting/OutliningIndicators/None.gif)
![](http://images.csdn.net/syntaxhighlighting/OutliningIndicators/None.gif)
![](http://images.csdn.net/syntaxhighlighting/OutliningIndicators/None.gif)
![](http://images.csdn.net/syntaxhighlighting/OutliningIndicators/None.gif)
![](http://images.csdn.net/syntaxhighlighting/OutliningIndicators/None.gif)
![](http://images.csdn.net/syntaxhighlighting/OutliningIndicators/None.gif)
![](http://images.csdn.net/syntaxhighlighting/OutliningIndicators/None.gif)
![](http://images.csdn.net/syntaxhighlighting/OutliningIndicators/None.gif)
![](http://images.csdn.net/syntaxhighlighting/OutliningIndicators/None.gif)
![](http://images.csdn.net/syntaxhighlighting/OutliningIndicators/None.gif)
![](http://images.csdn.net/syntaxhighlighting/OutliningIndicators/None.gif)
![](http://images.csdn.net/syntaxhighlighting/OutliningIndicators/None.gif)
![](http://images.csdn.net/syntaxhighlighting/OutliningIndicators/None.gif)
![](http://images.csdn.net/syntaxhighlighting/OutliningIndicators/None.gif)
![](http://images.csdn.net/syntaxhighlighting/OutliningIndicators/None.gif)
![](http://images.csdn.net/syntaxhighlighting/OutliningIndicators/None.gif)
![](http://images.csdn.net/syntaxhighlighting/OutliningIndicators/None.gif)
![](http://images.csdn.net/syntaxhighlighting/OutliningIndicators/None.gif)
![](http://images.csdn.net/syntaxhighlighting/OutliningIndicators/None.gif)
![](http://images.csdn.net/syntaxhighlighting/OutliningIndicators/None.gif)
![](http://images.csdn.net/syntaxhighlighting/OutliningIndicators/None.gif)
以上是7bit编码压缩为8bit编码的算法实现。
3 C网短信压缩方法
C网短信按照《中国联通800MHz CDMA数字蜂窝移动通信网UTK技术要求》规范进行组织,现简单地解释一条具体短信内容:
A01200003ASWD038810308130082028183850F806B63572853D19001002E002E002EC81C000002100204080B813193612004F7080B000320000001041017FFE09000
这里与G网短信类似,分别为主动式UIM命令标签(13),Alpha标识符(85)(O),设备标识(82),CDMA SMS TPDU(C8)
C81C000002100204080B813193612004F7080B000320000001041017FFE09000是CDMA SMS TPDU内容,解析如下:
C81C(tag+len)
00 (段消息类型:00 SMS point to point)
00 02 1002 (TAG:teleservice identifier)
04 08 0B813193612004F7 (Destination Address )
08 0B 00 03 200000 01 04 1017FFE0 (Bearer Data)
Bearer Data为080B000320000001041017FFE0,进行拆分,
08 0B(tag+len)
00 03 200000 (Message Identifier )
01 04 1017FFE0 (User data )
首先将0104后内容1017FFE0转换为bit:0001 0000 0001 0111 1111 1111 1110 0000
前5bit为编码类型,为00010,表示为7bit编码,进行划分即为:00010 0000001 0111111 11111111 00000
以上仅对具体短信进行分析,更多情况请参考《TIA-EIA-637-A》。
4, 参考文档:
1,GSM11.14
2, GSM03.40
3, GSM03.38
4, 中国联通800MHz CDMA数字蜂窝移动通信网UTK技术要求
5, TIA-EIA-637-A
关于短信内容格式及压缩方法相关推荐
- iPhone上将短信内容发送到指定邮箱的方法
iPhone上将短信内容发送到指定邮箱的方法 迄今为止,移动应用安全基本聚焦在以下几个方面,一是移动设备管理BYOD(bring your own device),二是移动恶意软件分析,三是移动设备用 ...
- php打开retmsg,PHP截取发动短信内容的方法
废话不多说了,直接给大家贴代码了,具体代码如下所示: $str_tmp = DAdmin_Utils::gbkStrSplit("短信内容", 700);//内容过长返回的是一个截 ...
- 国际短信平台接口调用的方法步骤,简单5步快速教程
如果您需要使用国际短信平台来满足您的业务需求,那么您需要了解短信平台接口调用的方法步骤. 接口调用是指您的应用程序通过网络接口与短信平台进行通信,从而实现向全世界发送短信的功能. 下面是国际短信平台接 ...
- Android 获取通话记录和短信内容
Android 获取通话记录和短信内容 一.获取通话记录 1.权限声明,需要在Manifest.xml文件中声明权限(读取通话记录权限): <uses-permission android:na ...
- android studio内容提供者(查看短信的猫)点击查看短信,闪退,无法显示短信内容。(附程序源代码,以及解决办法)
报错的问题: Permission Denial: readingcom.android.providers.telephony.SmsProvider uri content://sms/ 找到问题 ...
- Android开发之监听或获取手机短信内容
最近开始学习安卓,要做一个可以监听手机短信的内容,做个笔记,方便以后查看 有两种方式: 方式一:通过广播监听短信信息 注册一个广播接收器 <receiver android:name=" ...
- Android发送短信时 短信内容超长处理
Android发送短信时 短信内容超长处理 一条短信只可容纳70个中文,所以当短信长度超过70个中文字符时程序就要特殊处理了. 通常有两种方式: 一.通过sendTextMessage()方法逐条依次 ...
- 安卓手机短信发不出去设置方法
安卓手机短信发不出去设置方法 1. 在电话拨号界面输入:*#*#4636#*#*,如图(注意:下图中少一个*): 2. 然后出现工程界面: 3. 选手机信息,在下面找到S ...
- JavaScript 通过plus读取android手机短信内容
JavaScript 通过plus读取android手机短信内容. 1.获取android权限 在HBuilder工程中双击应用的"manifest.json"文件,切换到&quo ...
最新文章
- Nhibernate3循序渐进(三): 一对多映射和级联保存
- Google C2Dm相关文章
- pythonflask框架_Flask框架
- 如何查看linux命令源代码(转自网络)
- 立体剪纸风新春农历春节PSD分层海报素材
- python paramiko并发_Python之paramiko
- java column_@Column注解属性详解
- HTML5之语义化标签
- ClickHouse:存储A股数据实践
- 大漠插件7.2137
- C# 使用SHFileOperation 复制文件 注意引用方式
- 一些css/css3特效以及边框流光特效实现
- 用opencv将左右眼视角图片转换为红蓝3D图片
- 北京 Beijing
- 交叉熵、KL散度、Jeffery分歧、JS散度
- auto头文件 qt_C++ auto 关键字的使用
- 级联rc滤波_了解无源RC滤波器,看完这篇你就懂了(二)
- 【ROS小车课设】虚拟机端编译riki工作空间问题解决
- 鸢尾花分类python算法_BP算法鸢尾花分类
- 基于Xilinx artix 7的FPGA高级应用(二):千兆以太网通信(原理篇)