java pdu短信解码
java pdu短信解码
长短信未验证 有兴趣的可以试试
根据python的方法改写的
/**
* PDU短信解析
*
*
* @param pduPayload
* @return
*/
public static String retrieveSMSInfo(byte[] pduPayload) throws UnsupportedEncodingException { int startPos = 3;
//#Originator address
int mRP_OA_len = pduPayload[startPos];
byte[] mRP_OA = new byte[mRP_OA_len];
System.arraycopy(pduPayload, startPos + 1, mRP_OA, 0, mRP_OA_len);
startPos = startPos + 1 + mRP_OA_len;
int mTPDU_len = pduPayload[startPos];
//#BIT No. 7 6 5 4 3 2 1 0
//#uplink TP-RP TP-UDHI TP-SPR TP-VPF TP-RD TP-MTI
//#downlink TP-RP TP-UDHI TP-SRI TP-MMS TP-MTI
byte TP_Header = pduPayload[startPos + 1];
byte TP_Msg_Ref = pduPayload[startPos + 2];
int TP_UDHI = (TP_Header >> 6) & 1; //#短信内容是否包含协议头信息,0 不包含, 1 包含(长短信,push短信)
int TP_VPF = (TP_Header >> 3) & 3; //#是否包含有效期字节,0 不包含, 其他 包含
// #00表示无有效期,TP-VP设置为00。
// #10表示相对格式,TP-VP占用1字节。
// #01表示增加格式,TP-VP占用7字节。
// #11表示绝对格式,TP-VP占用7字节
int TP_MMS = (TP_Header >> 2) & 1;//# TP-MMS(TP-More-Message-to-Send):1 短信中心没有更多的消息发送
startPos = startPos + 3;
//#对方号码
byte smsNumberLen = pduPayload[startPos];
int mTP_DA_len = (smsNumberLen + 1) / 2 + 1;
byte[] mTP_DA = new byte[mTP_DA_len];
System.arraycopy(pduPayload, startPos + 1, mTP_DA, 0, mTP_DA_len * 1);
byte mTP_DA_format = mTP_DA[0];
byte[] smsNumberRaw = new byte[mTP_DA.length - 1];
System.arraycopy(mTP_DA, 1, smsNumberRaw, 0, mTP_DA.length - 1);
String smsNumber = "";
int j = 0;
for (int i = 0; i < smsNumberLen; i++) { if ((i & 1) == 0) {
smsNumber = smsNumber + (int) (smsNumberRaw[j] & 0xF);
} else {
smsNumber = smsNumber + (int) ((smsNumberRaw[j] & 0x0FF) >> 4);
j++;
}
}
startPos = startPos + 1 + mTP_DA_len; byte mTP_PID = pduPayload[startPos];
byte mTP_DCS = pduPayload[startPos + 1];//#“00”表示使用7位编码,设置为“02”使用8位编码,设置为“08”使用UCS2编码。 startPos = startPos + 2;
if (TP_VPF == 2) {
startPos = startPos + 1;
} else if (TP_VPF == 1 || TP_VPF == 3) {
startPos = startPos + 7;
}
//# 长短信:内容前面需要增加6个字段
//# 1、 字节一:包头长度,固定填写0x05;
//# 2、 字节二:包头类型标识,固定填写0x00,表示长短信;
//# 3、 字节三:子包长度,固定填写0x03,表示后面三个字节的长度;
//# 4、 字节四到字节六:包内容:
//# a) 字节四:长消息参考号,每个SP给每个用户发送的每条参考号都应该不同,可以从0开始,每次加1,最大255,便于同一个终端对同一个SP的消息的不同的长短信进行识别;
//# b) 字节五:本条长消息的的总消息数,从1到255,一般取值应该大于2;
//# c) 字节六:本条消息在长消息中的位置或序号,从1到255,第一条为1,第二条为2,最后一条等于第四字节的值。
//# 例子:
//# 05 00 03 00 02 01
//# 05 00 03 00 02 02
int smsPayloadLen = pduPayload[startPos];
startPos = startPos + 1;
String smsContent = ""; if (TP_UDHI == 1) {
//#长短信--未验证 可能需要转无符号
byte smsTotal = pduPayload[startPos + 4];
byte smsIdx = pduPayload[startPos + 5];
startPos = startPos + 6;
smsContent = "长短信(" + byteToHex(smsIdx) + "/" + byteToHex(smsTotal) + "}";
smsContent = new String(smsContent.getBytes("gbk"));
smsPayloadLen = smsPayloadLen - 6;
}
byte[] smsPayload = new byte[pduPayload.length - startPos];
System.arraycopy(pduPayload, startPos, smsPayload, 0, pduPayload.length - startPos); if (mTP_DCS == 0) {
//#7位编码--已验证
smsPayloadLen = (smsPayloadLen * 7 + 7) / 8;
int asciiData = 0;
int lastByteRemain = 0;
for (int i = 0; i < smsPayloadLen; i++) {
asciiData = asciiData + ((smsPayload[i] & 0x0FF) << lastByteRemain);
smsContent = smsContent + (char) ((asciiData & 0x0FF) & 0x7f);
asciiData = asciiData >> 7;
lastByteRemain = lastByteRemain + 1; if (lastByteRemain >= 7) {
smsContent = smsContent + (char) ((asciiData & 0x0FF) & 0x7f);
asciiData = asciiData >> 7;
lastByteRemain = lastByteRemain - 7;
}
}
} else if (mTP_DCS == 8) {
//# UCS-2 --已验证 可正常解析
for (int i = 0; i < smsPayloadLen; i = i + 2) {
int cc1 = (smsPayload[i] & 0x0FF) * 256;
int cc2 = smsPayload[i + 1] & 0x0FF;
smsContent = smsContent + (char) (cc1 + cc2); }
}
return smsNumber + ":" + smsContent;
}
测试数据
 byte[] smsDataCN = {
                     0x00, 0x01, 0x00,
                     0x08, (byte) 0x91, 0x68, 0x31, 0x08, 0x10, 0x00, 0x05,
                     (byte) 0xf0, 0x23, 0x01, (byte) 0xb9, 0x0b, (byte) 0x81, 0x31,
                     (byte) 0x99, (byte) 0x98, 0x30, 0x67, (byte) 0xf7, 0x00,
                     0x08, 0x16, 0x55, 0x4a, 0x55, 0x4a, 0x55, 0x4a, 0x55, 0x4a, 0x55,
                     0x4a, 0x55, 0x4a, 0x54, 0x75, 0x54, 0x75, 0x54, 0x75, 0x60, 0x69,
                     0x68, 0x39, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
                     0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
                     0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
                     0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
                     0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
                     0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
                     0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
                     0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
                     0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
                     0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
                     0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
                     0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
                     0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
                     0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
                     0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
                     0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
                     0x00, 0x00, 0x00, 0x00, 0x00};
中文测试数据
 byte[] smsDataEN = {
                     0x00,0x03,0x00,0x08,
                     (byte)0x91,
                     0x68,0x31,0x08,0x10,0x00,
                     0x05,
                     (byte)0xf0,
                     0x17,0x01,
                     (byte)0xbb,
                     0x0b,
                     (byte)0x81,
                     0x31,
                     (byte)0x99,
                     (byte)0x98,
                     0x30,
                     0x68,
                     (byte)0xf7,
                     0x00,0x00,0x0b,
                     (byte)0xe8,
                     0x32,
                     (byte)0x9b,
                     (byte)0xfd,
                     0x06,
                     (byte)0xdd,
                     (byte)0xdf,
                     0x72,
                     (byte)0xb2,
                     0x0b,
                     0x08,
                     0x16, 0x55, 0x4a, 0x55, 0x4a, 0x55,
                     0x4a, 0x55, 0x4a, 0x55,
                     0x4a, 0x55, 0x4a, 0x54, 0x75, 0x54, 0x75, 0x54, 0x75, 0x60, 0x69,
                     0x68, 0x39, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
                     0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
                     0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
                     0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
                     0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
                     0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
                     0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
                     0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
                     0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
                     0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
                     0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
                     0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
                     0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
                     0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
                     0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
                     0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
                     0x00, 0x00, 0x00, 0x00, 0x00};
英文测试数据
java pdu短信解码的更多相关文章
- Java应用短信猫
		首先确定短信猫正常连接到主机,并安装SIM卡.先用超级终端测试短息猫能不能用.安装minicom:#sudo apt-get install minicom安装完成后,执行#sudo minicom ... 
- java发送短信--httpclient方式
		最近头让我写个发送短信的java程序检测BI系统,检查数据库是否有异常发送,有则发送短信到头的手机里.这里我直说httpclient方式的get请求方式,并且已经有方式的短信的接口了,所以只要再加上参 ... 
- java发送短信验证码
		业务: 手机端点击发送验证码,请求发送到java服务器端,由java调用第三方平台(我们使用的是榛子云短信http://smsow.zhenzikj.com)的短信接口,生成验证码并发送. SDK下载 ... 
- 【Java】短信信息提取设计
		问题产生:当有要求做信息有效性校验的时候,如何提取短信中有用的信息? 举个例子:有这样一条短信消息: [XXXXXX提醒]尊敬的客户,截止03月21日15:29,您本月套餐中包含手机上网国内流量累计1 ... 
- Java发送短信
		1.接口使用介绍 发送短信肯定需要使用第三方接口,Java本身是肯定不能直接发送短信的.第三方接口有很多,这里直接找个正规靠谱一点的学习一下 这里使用了中国网建(http://sms.webchine ... 
- 关于用JAVA开发短信方面的知识
		现在流行的网络业务莫过于短信了.网易新浪等都因此而盈利,股价上涨.我凭自己的经验和公司支持,也就乘着东风来研究一下了! 首先,你要选择一台移动或者联通的短信服务器做你们的发送短信接口.这是最关键的 ... 
- java发送短信验证码的功能实现
		总结一下发送短信验证码的功能实现 (题外话:LZ是在腾讯云买的第三方(山东鼎信)短信服务平台的接口,1块钱20次的套餐来练手,哈哈,给他们打个广告,有需要的可以去购买哈,下面是购买链接短信服务平台购买 ... 
- Java实现短信中提取号码
		Description 提取一条短信里所有的电话号码,电话号码之间换行打印,短信的内容由用户输入. Input 第一行有个整数n(1≤n≤1000)表示测试用例的个数.其后的每一行中有一条短信,每一条 ... 
- Java 发送短信
		这是一个调用sms接口发短信的程序,支持同时发送的短信量并不是很大,只作为学习使用(当然如果你想内部使用也行) 源码:package com; import org.apache.commons.ht ... 
随机推荐
- [OJ] Data Stream Median (Hard)
			LintCode 81. Data Stream Median (Hard) 思路: 用一个大根堆保存较小的一半数, 一个小根堆保存较大的一半数. 每次根据num和两个堆顶的数据决定往哪个堆里面放. ... 
- 【HDOJ】1258 Sum It Up
			典型的深搜,剪枝的时候需要跳过曾经搜索过的相同的数目,既满足nums[i]=nums[i-1]&&visit[i-1]==0,visit[i-1]==0可以说明该点已经测试过. #in ... 
- git workflow 原文   以及缺点
			原文链接 http://nvie.com/posts/a-successful-git-branching-model/ 有人发现git work flow的缺点,历史提交会变得混乱 http://e ... 
- VM8下安装Mac OS X 10.7
			下载Mac OS X 10.7 安装包http://115.com/file/clj1iu8m# 下载HJMac http://115.com/file/cljyu1rh# ... 
- windows播放声音
			一般播放MP3常见的有两种方法,一种是自己解码,另外一种用系统的库,比如MCI,当然如果可以用控件直接用个控件会更方便. 1. 使用mci #include <windows.h> ... 
- iOS8新增加的frameworks, 在目前基于7以上开发的情况下, 使用下列sdk要注意设置成optional
			Added frameworks: AVKitCloudKitCoreAudioKitCoreAuthenticationHealthKitHomeKitLocalAuthenticationMeta ... 
- SharePoint : 使用SPQuery对象时要注意的事项
			转:http://www.cnblogs.com/chenxizhang/archive/2009/10/23/1588415.html 我们经常需要对一个列表进行查询,此时最灵活的方式就是直接使用S ... 
- FZU2235 国王的出游 水题
			因为只有1e5个点,所以直接离散化bfs就好 #include <cstdio> #include <cstring> #include <queue> #incl ... 
- .net软件自动化测试笔记(API-1)
			.net 软件测试自动化之道 API(Application Programming Interface)包括单元测试(Unit Testing),模块测试(Module Testing),组件测试( ... 
- linux内存分配机制
			这几天在观察apache使用内存情况,所以特意了解了下linux的内存机制,发现一篇写得还不错.转来看看. 一般来说在ps aux中看到的rss就是进程所占用的物理内存.但是如果将所有程序的rss加起 ... 
