Java pdu短信解码全面解析
长短信未验证有兴趣的可以试试
根据python的方法改写的
/**
*PDU短信解析
*
*
*@parampduPayload
*@return
*/
publicstaticStringretrieveSMSInfo(byte[]pduPayload)throwsUnsupportedEncodingException{
intstartPos=3;
//#Originatoraddress
intmRP_OA_len=pduPayload[startPos];
byte[]mRP_OA=newbyte[mRP_OA_len];
System.arraycopy(pduPayload,startPos+1,mRP_OA,0,mRP_OA_len);
startPos=startPos+1+mRP_OA_len;
intmTPDU_len=pduPayload[startPos];
//#BITNo.76543210
//#uplinkTP-RPTP-UDHITP-SPRTP-VPFTP-RDTP-MTI
//#downlinkTP-RPTP-UDHITP-SRITP-MMSTP-MTI
byteTP_Header=pduPayload[startPos+1];
byteTP_Msg_Ref=pduPayload[startPos+2];
intTP_UDHI=(TP_Header>>6)&1;//#短信内容是否包含协议头信息,0不包含,1包含(长短信,push短信)
intTP_VPF=(TP_Header>>3)&3;//#是否包含有效期字节,0不包含,其他包含
//#00表示无有效期,TP-VP设置为00。
//#10表示相对格式,TP-VP占用1字节。
//#01表示增加格式,TP-VP占用7字节。
//#11表示绝对格式,TP-VP占用7字节
intTP_MMS=(TP_Header>>2)&1;//#TP-MMS(TP-More-Message-to-Send):1短信中心没有更多的消息发送
startPos=startPos+3;
//#对方号码
bytesmsNumberLen=pduPayload[startPos];
intmTP_DA_len=(smsNumberLen+1)/2+1;
byte[]mTP_DA=newbyte[mTP_DA_len];
System.arraycopy(pduPayload,startPos+1,mTP_DA,0,mTP_DA_len*1);
bytemTP_DA_format=mTP_DA[0];
byte[]smsNumberRaw=newbyte[mTP_DA.length-1];
System.arraycopy(mTP_DA,1,smsNumberRaw,0,mTP_DA.length-1);
StringsmsNumber="";
intj=0;
for(inti=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;
bytemTP_PID=pduPayload[startPos];
bytemTP_DCS=pduPayload[startPos+1];//#“00”表示使用7位编码,设置为“02”使用8位编码,设置为“08”使用UCS2编码。
startPos=startPos+2;
if(TP_VPF==2){
startPos=startPos+1;
}elseif(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,最后一条等于第四字节的值。
//#例子:
//#050003000201
//#050003000202
intsmsPayloadLen=pduPayload[startPos];
startPos=startPos+1;
StringsmsContent="";
if(TP_UDHI==1){
//#长短信--未验证可能需要转无符号
bytesmsTotal=pduPayload[startPos+4];
bytesmsIdx=pduPayload[startPos+5];
startPos=startPos+6;
smsContent="长短信("+byteToHex(smsIdx)+"/"+byteToHex(smsTotal)+"}";
smsContent=newString(smsContent.getBytes("gbk"));
smsPayloadLen=smsPayloadLen-6;
}
byte[]smsPayload=newbyte[pduPayload.length-startPos];
System.arraycopy(pduPayload,startPos,smsPayload,0,pduPayload.length-startPos);
if(mTP_DCS==0){
//#7位编码--已验证
smsPayloadLen=(smsPayloadLen*7+7)/8;
intasciiData=0;
intlastByteRemain=0;
for(inti=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;
}
}
}elseif(mTP_DCS==8){
//#UCS-2--已验证可正常解析
for(inti=0;i<smsPayloadLen;i=i+2){
intcc1=(smsPayload[i]&0x0FF)*256;
intcc2=smsPayload[i+1]&0x0FF;
smsContent=smsContent+(char)(cc1+cc2);
}
}
returnsmsNumber+":"+smsContent;
}
以上所述是小编给大家介绍的Javapdu短信解码全面解析,希望对大家有所帮助,如果大家有任何疑问请给我留言,小编会及时回复大家的。在此也非常感谢大家对毛票票网站的支持!