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之間。編碼過程中的間隔決定了符號壓縮後的...