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短信解码全面解析,希望对大家有所帮助,如果大家有任何疑问请给我留言,小编会及时回复大家的。在此也非常感谢大家对毛票票网站的支持!