用Java實現PDU編碼

2021-08-23 15:10:51 字數 3283 閱讀 2654

1.發英文

發英文時可以進行7bit編碼或8bit編碼.因為英文和數字等小於128的ascii碼,高位為0,所以,我們可以把最高位也利用起來,去掉最高位的0,然後,每個位元組的位以次向前移動,這樣一條簡訊就可以發最多160個字元。因為gsm協議規定簡訊最多是140個位元組,這樣的話總共是140×8=1120位,如果我們每個位元組只佔7位的話,那麼就可以容下:1120/7=160個字元。

當然也可以用ucs2(也就是utf-16,每個字元佔兩個位元組),這樣的話,傳送只能傳送最多有70個英文本元

2.發中文

傳送中文時,必須用ucs2進行編碼,最多可以發140/2=70個漢字。

接收到短訊息之後,按編碼方式進行解碼就行了。

package com.gftech.common;

public class pdupack ...

public pdupack(string src) ...

temp = src.substring(20, 22);

addrlen = integer.parseint(temp, 16);

if (addrlen % 2 == 0)

temp = src.substring(24, 24 + addrlen);

else

temp = src.substring(24, 24 + addrlen + 1);

addr = gfstring.interchange(temp);

// 去掉為補齊為偶數加上的那一位

if (addr != null && addr.length() % 2 == 0) ...

if (addrlen % 2 == 0) ... else ...

if (msgcoding.equals("08"))

msgcontent = gfstring.unicode2gb(temp);

else

msgcontent = gfstring.decode7bit(temp);}}

public void setsmsc(string s) ... else if (s.length() == 13

&& s.substring(0, 4).equals("8613")) ... else if (s.length() == 14

&& s.substring(0, 5).equals("+8613")) ... else

return;

this.smsc= gfstring.interchange(centerno);}}

public void setaddr(string ad) ... else if (ad.length() == 13 && ad.substring(0, 4).equals("8613")) ... else if (ad.length() == 14 && ad.substring(0, 5).equals("+8613")) ... else if (ad.length() > 0) ... else

return;

addr = gfstring.interchange(centerno);}}

/** *//**

* 設定編碼方式

* * @param encoding

* 0:表示7-bit編碼 4:表示8-bit編碼 8:表示ucs2編碼

*/public void setmsgcoding(int encoding) ...

/** *//**

* 短訊息內容

* * @param content

*/public void setmsgcontent(string content) ... else ...

if(msgcontent!=null)...}}

/** *//**

* * @return 經過pdu編碼的結果,十六進製制字串形式

*/public string getcodedresult() ...

return result;

}public string getaddr() ...

public string getmsgcoding() ...

public string getmsgcontent() ...

public int getmsglen() ...

public string getsmsc() ...

//todo:temp

public static string encode7bit(string src) ...

}result=result.touppercase();

}return result;}}

/** *//**

* 7-bit編碼 把ascii碼值最高位為0的字串進行壓縮轉換成8位二進位制表示的字串

* * @param src

* @return

*/public static string encode7bit(string src) ...

}result=result.touppercase();

}return result;

}/** *//**

* 對7-bit編碼進行解碼

* @param src 十六進製制的字串,且為偶數個

* @return 源字串

*/public static string decode7bit(string src) ...

if(j==src.length() /2)

result+=(char)left;}}

return result;

}/** *//**

* 把unicode編碼的字串轉化成漢字編碼的字串

* * @param hexstring

* @return

*/public static string unicode2gb(string hexstring) ... catch (numberformatexception e) ...

}return sb.tostring();

}/** *//**

* 把漢字轉化成unicode編碼的字串

* * @param gbstring

* @return

*/public static string gb2unicode(string gbstring) ...

return result.touppercase();

}4.結束語

上面的源**可能並不十分完整,但最重要的部分都有了。做為大家學習考參的例子。

pdu編碼的詳細介紹,請參考下面的參考資料

5.參考資料

bhw98的專欄 ttp:

ue字元編碼 用ultraedit實現編碼轉換

bom 這裡涉及到乙個bom byte order mark 的概念.簡單的講,在unicode標準中,為了標示文字檔案的編碼型別,可以在文字檔案的開始插入幾個特殊的byte,通過這幾個特殊的byte,應用 對於unicode,幾種編碼的bom如下 utf 32,big endian 檔案的前4個b...

SNMP協議 PDU報文格式分析(BER編碼)

簡單網路管理協議 snmp 是目前在計算機網路中用得最廣泛的網路管理協議,它使用asn.1 abstract syntax notation one 來定義snmp報文格式和mib management information base 變數的名稱。asn.1是一種描述資料和資料特徵的正式語言,它和...

算術編碼用c 的實現

算術編碼在圖象資料壓縮標準 如jpeg,jbig 中扮演了重要的角色。在算術編碼中,訊息用0到1之間的實數進行編碼。算術編碼用到了兩個基本的引數 符號的概率和它的編碼間隔。信源符號的概率決定壓縮編碼的效率,也決定編碼過程中信源符號的間隔,而這些間隔包含在0到1之間。編碼過程中的間隔決定了符號壓縮後的...