最新国产好看的视频,伊人天堂AV在线,国产Aaaaaa视频,蜜臀视频在线观看一区,人妻av色图,密臀久久久精品影片,青青视频免费观看毛片,久草在线观看视,国产三级精品色情在线

Java pdu短信解碼全面解析

 更新時間:2016年10月27日 14:15:59   作者:舌尖上的駱駝  
本文是根據(jù)python的方法改寫的pdu短信解碼,非常不錯,代碼簡單易懂具有參考借鑒價值,感興趣的朋友一起看看吧

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

根據(jù)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; //#短信內(nèi)容是否包含協(xié)議頭信息,0 不包含, 1 包含(長短信,push短信)
int TP_VPF = (TP_Header >> 3) & 3; //#是否包含有效期字節(jié),0 不包含, 其他 包含 
// #00表示無有效期,TP-VP設(shè)置為00。 
// #10表示相對格式,TP-VP占用1字節(jié)。 
// #01表示增加格式,TP-VP占用7字節(jié)。 
// #11表示絕對格式,TP-VP占用7字節(jié)
int TP_MMS = (TP_Header >> 2) & 1;//# TP-MMS(TP-More-Message-to-Send):1 短信中心沒有更多的消息發(fā)送
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位編碼,設(shè)置為“02”使用8位編碼,設(shè)置為“08”使用UCS2編碼。
startPos = startPos + 2;
if (TP_VPF == 2) {
startPos = startPos + 1;
} else if (TP_VPF == 1 || TP_VPF == 3) {
startPos = startPos + 7;
}
//# 長短信:內(nèi)容前面需要增加6個字段 
//# 1、 字節(jié)一:包頭長度,固定填寫0x05; 
//# 2、 字節(jié)二:包頭類型標(biāo)識,固定填寫0x00,表示長短信; 
//# 3、 字節(jié)三:子包長度,固定填寫0x03,表示后面三個字節(jié)的長度; 
//# 4、 字節(jié)四到字節(jié)六:包內(nèi)容: 
//# a) 字節(jié)四:長消息參考號,每個SP給每個用戶發(fā)送的每條參考號都應(yīng)該不同,可以從0開始,每次加1,最大255,便于同一個終端對同一個SP的消息的不同的長短信進(jìn)行識別; 
//# b) 字節(jié)五:本條長消息的的總消息數(shù),從1到255,一般取值應(yīng)該大于2; 
//# c) 字節(jié)六:本條消息在長消息中的位置或序號,從1到255,第一條為1,第二條為2,最后一條等于第四字節(jié)的值。 
//# 例子: 
//# 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) {
//#長短信--未驗證 可能需要轉(zhuǎn)無符號
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短信解碼全面解析,希望對大家有所幫助,如果大家有任何疑問請給我留言,小編會及時回復(fù)大家的。在此也非常感謝大家對腳本之家網(wǎng)站的支持!

相關(guān)文章

  • Java的深拷貝和淺拷貝深入了解

    Java的深拷貝和淺拷貝深入了解

    這篇文章主要為大家介紹了Java的深拷貝和淺拷貝,具有一定的參考價值,感興趣的小伙伴們可以參考一下,希望能夠給你帶來幫助
    2022-01-01
  • Java詳細(xì)分析連接數(shù)據(jù)庫的流程

    Java詳細(xì)分析連接數(shù)據(jù)庫的流程

    Java數(shù)據(jù)庫連接,JDBC是Java語言中用來規(guī)范客戶端程序如何來訪問數(shù)據(jù)庫的應(yīng)用程序接口,提供了諸如查詢和更新數(shù)據(jù)庫中數(shù)據(jù)的方法。JDBC也是Sun Microsystems的商標(biāo)。我們通常說的JDBC是面向關(guān)系型數(shù)據(jù)庫的
    2022-05-05
  • springboot無法跳轉(zhuǎn)頁面的問題解決方案

    springboot無法跳轉(zhuǎn)頁面的問題解決方案

    這篇文章主要介紹了springboot無法跳轉(zhuǎn)頁面的問題解決方案,文中通過示例代碼介紹的非常詳細(xì),對大家的學(xué)習(xí)或者工作具有一定的參考學(xué)習(xí)價值,需要的朋友可以參考下
    2019-09-09
  • java微信支付接入流程詳解

    java微信支付接入流程詳解

    這篇文章主要為大家詳細(xì)介紹了java微信支付接入流程,具有一定的參考價值,感興趣的小伙伴們可以參考一下
    2019-05-05
  • java實現(xiàn)連連看游戲

    java實現(xiàn)連連看游戲

    這篇文章主要為大家詳細(xì)介紹了java實現(xiàn)連連看游戲,文中示例代碼介紹的非常詳細(xì),具有一定的參考價值,感興趣的小伙伴們可以參考一下
    2019-01-01
  • 淺談SSH框架中spring的原理

    淺談SSH框架中spring的原理

    下面小編就為大家?guī)硪黄獪\談SSH框架中spring的原理。小編覺得挺不錯的,現(xiàn)在就分享給大家,也給大家做個參考。一起跟隨小編過來看看吧
    2017-01-01
  • 深入理解Java設(shè)計模式之模板方法模式

    深入理解Java設(shè)計模式之模板方法模式

    這篇文章主要介紹了JAVA設(shè)計模式之模板方法模式的的相關(guān)資料,文中示例代碼非常詳細(xì),供大家參考和學(xué)習(xí),感興趣的朋友可以了解
    2021-11-11
  • maven install報錯中程序包xxx不存在的問題解決

    maven install報錯中程序包xxx不存在的問題解決

    本文主要介紹了maven install報錯中程序包xxx不存在的問題解決,文中通過示例代碼介紹的非常詳細(xì),對大家的學(xué)習(xí)或者工作具有一定的參考學(xué)習(xí)價值,需要的朋友們下面隨著小編來一起學(xué)習(xí)學(xué)習(xí)吧
    2022-05-05
  • 剖析Fork?join并發(fā)框架工作竊取算法

    剖析Fork?join并發(fā)框架工作竊取算法

    這篇文章主要為大家剖析介紹了Fork?join并發(fā)框架工作竊取算法的示例,有需要的朋友可以借鑒參考下,希望能夠有所幫助,祝大家多多進(jìn)步,早日升職加薪
    2022-06-06
  • java 獲取路徑的各種方法(總結(jié))

    java 獲取路徑的各種方法(總結(jié))

    下面小編就為大家?guī)硪黄猨ava 獲取路徑的各種方法(總結(jié))。小編覺得挺不錯的,現(xiàn)在就分享給大家,也給大家做個參考。一起跟隨小編過來看看吧
    2016-08-08

最新評論

南和县| 天等县| 应城市| 邢台市| 绥棱县| 辽阳市| 黄大仙区| 通辽市| 连平县| 襄城县| 沁水县| 连山| 海宁市| 油尖旺区| 湖北省| 定襄县| 申扎县| 淮南市| 平顶山市| 大荔县| 札达县| 尼木县| 宜良县| 南开区| 北川| 东宁县| 高邑县| 循化| 溧阳市| 临沂市| 县级市| 论坛| 马山县| 太仓市| 四会市| 瑞昌市| 耿马| 日土县| 五大连池市| 西华县| 富川|