一区二区三区在线-一区二区三区亚洲视频-一区二区三区亚洲-一区二区三区午夜-一区二区三区四区在线视频-一区二区三区四区在线免费观看

服務器之家:專注于服務器技術及軟件下載分享
分類導航

PHP教程|ASP.NET教程|JAVA教程|ASP教程|

服務器之家 - 編程語言 - JAVA教程 - Java pdu短信解碼全面解析

Java pdu短信解碼全面解析

2020-06-28 11:24舌尖上的駱駝 JAVA教程

本文是根據python的方法改寫的pdu短信解碼,非常不錯,代碼簡單易懂具有參考借鑒價值,感興趣的朋友一起看看吧

短信未驗證 有興趣的可以試試

根據python的方法改寫的

?
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
/**
* 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;
}

以上所述是小編給大家介紹的Java pdu短信解碼全面解析,希望對大家有所幫助,如果大家有任何疑問請給我留言,小編會及時回復大家的。在此也非常感謝大家對服務器之家網站的支持!

原文鏈接:http://www.cnblogs.com/Camel2016/archive/2016/10/27/6003765.html

延伸 · 閱讀

精彩推薦
主站蜘蛛池模板: 青柠网在线观看视频 | 国产午夜永久福利视频在线观看 | 幻女free性俄罗斯第一次摘花 | 久久www免费人成高清 | 国产chinese男男gaygay | 午夜福利理论片在线播放 | 国产成人免费片在线观看 | freexxxxxhd张柏芝 | 免费免费啪视频在线观播放 | 四虎永久成人免费 | 含羞草传媒每天免费一次破解 | 岛国片免费观看 | 大jjjj免费看视频 | 搓光美女衣 | 动漫白丝袜美女羞羞 | 第一次不是你高清在线观看 | 国产99久久精品一区二区 | 王雨纯羞羞| 欧美午夜视频一区二区三区 | 精品蜜臀AV在线天堂 | 蜜柚精彩在线观看 | 武侠艳妇屈辱的张开双腿 | 国产91一区二区在线播放不卡 | 日韩欧美高清 | 古装床戏做爰无遮挡三级 | 美女禁18 | 青青草久 | 日韩欧美一卡二区 | 99视频精品国在线视频艾草 | 女同志freelesvoices | 星空无限传媒xk8129 | 日本无吗免费一二区 | 暴露狂婷婷医院暴露tx | 福利久草| 精品亚洲视频在线观看 | 性趣味商品推荐 | 91精品国产9l久久久久 | 日韩精品免费一区二区 | 满溢游泳池免费 | 91小视频在线观看免费版高清 | 大又大又粗又爽女人毛片 |