參考http://hi.baidu.com/mygia/blog/item/18032e7f149be81b29388afa.html
smsEncodedNumber方法不對,已經按照規則http://wenku.baidu.com/view/bb06353043323968011c92f7.html修改
並且加了短信的分割和合並
import java.io.File;
import java.io.UnsupportedEncodingException;
public class PduCoding {
public static String decodeSms(String text){
StringBuffer sb=new StringBuffer();
try{
for(int i=0,n=text.length();i <n;i+=4){
char c = (char)Integer.parseInt(text.substring(i,i+4),16);
sb.append(c);
}
}catch(Exception e){
System.out.println("---------decodeSms--text");
sb.append(text);
}
return sb.toString();
}
private static String smsEncodedContent(String srvContent)
{
StringBuffer sb = new StringBuffer();
int length = srvContent.length();
for(int i=0;i<length;i++){
String s = srvContent.substring(i, i+1);
//是字符,前面兩位是00 中文需要四位16進制來表示
if(s.getBytes().length==1){
sb.append("00");
}
sb.append(Integer.toHexString(srvContent.charAt(i)));
}
return sb.toString().toUpperCase();
}
public static String smsEncodedContentLength(int len){
StringBuffer sb=new StringBuffer();
//最後接上內容編碼長度的1/2 用16進制的2位來表示
if(Integer.toHexString(len/2).length()<2){
sb.append("0");
}
sb.append(Integer.toHexString(len/2));
return sb.toString().toUpperCase();
}
/**
* 函數說明:
* 1,將奇數位和偶數位交換。
* 2,短信中心號奇偶數交換後,看看長度是否爲偶數,如果不是,最後添加F
* 3,加上短信中心號類型,91爲國際化
* 4,計算編碼後的短信中心號長度,並格化成二位的十六進制
*/
public static String smsEncodedCenterNumber(String srvCenterNumber)
{
if (!(srvCenterNumber.substring(0,2).equals("86")))
{
srvCenterNumber = "86"+srvCenterNumber; //檢查當前接收手機號是否按標準格式書寫,不是,就補上“86”
}
StringBuffer s = new StringBuffer();
int nLength = srvCenterNumber.length();
if(Integer.toHexString((nLength+3)/2).toString().length()<2){
s.append("0");
}
s.append(Integer.toHexString((nLength+3)/2));
s.append("91");
for(int i = 1 ; i < nLength;i += 2)//奇偶互換
{
s.append(srvCenterNumber.charAt(i));
s.append(srvCenterNumber.charAt(i-1));
}
if(!(nLength % 2 == 0)) //是否爲偶數,不是就加上F,並對最後一位與加上的F位互換
{
s.append('F');
s.append(srvCenterNumber.charAt(nLength-1));
}
return s.toString();
}
/**
* 函數說明:
* 1,檢查當前接收手機號是否按標準格式書寫,不是,就補上“86”
* 1,將奇數位和偶數位交換。
* 2,短信中心號奇偶數交換後,看看長度是否爲偶數,如果不是,最後添加F
* 11000D91和000800
*
*/
private static String smsEncodedNumber(String srvNumber,boolean multi)
{
StringBuffer s = new StringBuffer();
if(multi){
s.append("5100");
}else{
s.append("1100");
}
if (!(srvNumber.substring(0,2) == "86")){
s.append(toHexString(srvNumber.length()+2));
s.append("91");
s.append("68"); //檢查當前接收手機號是否按標準格式書寫,不是,就補上“86”
}else{
s.append(toHexString(srvNumber.length()));
s.append("91");
}
int nLength = srvNumber.length();
for(int i = 1 ; i < nLength ; i += 2){//將奇數位和偶數位交換
s.append(srvNumber.charAt(i));
s.append(srvNumber.charAt(i-1));
}
if(!(nLength % 2 == 0)) {//是否爲偶數,不是就加上F,並對最後一位與加上的F位互換
s.append('F');
s.append(srvNumber.charAt(nLength-1));
}
s.append("000800");
return s.toString();
}
public static String multiMessageHeader(String unique,int size,int index){
String s="050003";
s+=unique+toHexString(size)+toHexString(index);
return s;
}
public static String toHexString(int text){
String s=Integer.toHexString(text);
if(s.length()<2){
s="0"+s;
}
return s.toUpperCase();
}
private String number2String(int num){
return num<10?"0"+String.valueOf(num):String.valueOf(num);
}
public static String encodeSms(String strCenterNumber, String strNumber, String strSMScontent)
{
StringBuffer sb = new StringBuffer();
sb.append(smsEncodedCenterNumber(strCenterNumber));
sb.append(smsEncodedNumber(strNumber,false));
String text=smsEncodedContent(strSMScontent);
sb.append(smsEncodedContentLength(text.length()));
sb.append(text);
return sb.toString();
}
public static String encodeMultiSms(String strCenterNumber, String strNumber, String strSMScontent,String unique,int size,int index)
{
StringBuffer sb = new StringBuffer();
sb.append(smsEncodedCenterNumber(strCenterNumber));
sb.append(smsEncodedNumber(strNumber,true));
String s=smsEncodedContent(strSMScontent);
sb.append(toHexString(6+s.length()/2));
sb.append(multiMessageHeader(unique,size,index));
sb.append(s);
return sb.toString();
}
public static int encodeSmsLength(String strNumber, String strSMScontent){
return (smsEncodedNumber(strNumber,false).length()+smsEncodedContent(strSMScontent).length())/2;
}
public static int encodeSmsLength(int len,String centerAddress){
return len/2-smsEncodedCenterNumber(centerAddress).length()/2;
//return (smsEncodedNumber(strNumber,false).length()+14+smsEncodedContent(strSMScontent).length())/2;
}
/* 接收的手機號:13715342642
短信中心號:8613800755000
短信內容:你好,Hello!
0891 683108705500F0 11000D 91 683117352446F2000800 124F60597DFF0C00480065006C006C006F0021
*/
public static void main(String[] args){
//testEncodeSms();
//testPduMode();
//System.out.println(decodeSms("57268FDB4C16012C4E8C2A91CD7D65B96CD553D10157268FDB4C16012C4E8C2A91CD7D65B96CD553D10157268FDB4C16012C4EA"));
//System.out.println(decodeSms("90019001900190019001"));
//System.out.println(smsEncodedContent("送送送送送"));
// System.out.println(decodeSms(smsEncodedContent("送送送送送")));
//System.out.println("encodingOther:"+encodingOther("字符進行編碼abc"));
// System.out.println("encodingOther:"+encodingOther("字符進行編碼"));
//String s= "字符進行編碼,然後調用EncodingSMS第二個重載方法發送,發送長短信時需要先調用EncodingOther對字符進行編碼,然後調用E字符進行編碼,然後調用EncodingSMS第二個重載方法發送";
// System.out.println(DecodeUCS2("6C5B577B268FDB884C7F1678017B2C4E8C4E2A91CD8F7D65B96CD553D190015B577B268FDB884C7F167A"));
/*String s1=s.substring(0, 54);
String len=toHexString( (smsPDUEncoded(s1).length()/2)+6);
System.out.println("^^^:"+len);
smsDecodedCenterNumber("8613800210500");
System.out.println(multiMessageHeader("00",32,4));*/
System.out.println(toHexString(13));
}
public static void testEncodeSms(){
System.out.println(PduCoding.encodeSms("8613800210500","13585986846","你好,Hello!"));
System.out.println(PduCoding.encodeSmsLength("13585986846","你好,Hello!"));
System.out.println(PduCoding.smsEncodedCenterNumber("8613800210500"));
System.out.println(PduCoding.smsEncodedNumber("13585986846",false));
}
public static void testDecodeSms(){
//String s = "050003C402015C0A656C76845BA26237FF0C4E0A6D7779FB52A877ED4FE184254E1A53854E3A60A863D04F9B4E1A52A1529E7406548C67E58BE2670D52A1FF0C8BF776F463A556DE590D5E8F521753F7FF1A000A003000318BDD8D394FE1606F67E58BE24E0E5B9A5236000A00300032670065B04F1860E0000A003000334E1A52A1529E7406000A00300034";
String[] str={
"0891683108401105F0240D91685149910183F0000890013261604423026D4B",
"0891683108401105F0040D91683105706027F50008900162311142230A6D4B8BD5003100320033",
"0891683108401105F0040D91683105706027F500009001728033652304D4E2940A",
"0891683108401105F0040D91683105706027F50000900172907074230928D58612D9505429"};
for(int i=0;i<str.length;i++){
System.out.println("-------"+i+":"+decodeSms(str[i]));
}
}
}