短信PUD編碼

參考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]));
		  }
	   }
}


發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章