PDF傳送簡訊2

2021-09-18 07:17:33 字數 2699 閱讀 1884

sms是由esti 所制定的乙個規範(gsm 03.40 和 gsm 03.38)。有兩種方式來傳送和接收sms訊息:文字模式或者pdu(protocol description unit)模式。文字模式只能傳送普通的ascii字元,而要傳送、鈴聲、其它編碼的字元(如中文)就必須採用pdu模式。

pdu模式中,可以採用三種編碼方式來編碼要傳送的內容,分別是 7-bit編碼、8-bit編碼、16-bit編碼。7-bit編碼用於傳送普通的ascii字元;8-bit編碼通常用於傳送資料訊息,比如和鈴聲等;而16-bit編碼用於傳送unicode字元。在這三種編碼方式下,可以傳送的最大字元數分別是 160、 140、70。

若要傳送中文(或日文等),必須採用pdu模式的unicode編碼方式。

1、gb2312 編碼到unicode 編碼的轉換

在 redhat 7.3系統上,預設是用gb2312編碼儲存中文字元的(對於中英文混合的文字也是如此)。所以首先需要把 gb2312 編碼的字串轉換到 unicode編碼的字串。

gb2312編碼是一種多位元組編碼方式,對於中文,用2個位元組表示,對於英文,用1個位元組表示,就是英文的ascii碼。(注:我沒有仔細看過 gb2312編碼的規範,以上理解是實際開發中得出來的,不能保證正確性)。unicode編碼是雙位元組編碼方式,對所有字元,都採用2個位元組編碼。在 linux平台上,gb2312編碼到unicode編碼的轉換,可以有三種實現方式(或者更多):

1)、用 mbstowcs () 函式。就是多位元組編碼到寬字元的轉換。我試過它,可以正確的轉換,但是這個函式可能不是很可靠。

2)、用 gb2312 à unicode 的轉換表,手動查表轉換。網上有這樣的轉換表,你需要對每乙個gb2312字元,根據它是中文字元還是英文本元,分別轉換。

3)、用 iconv () 函式。這可能是linux上的標準的方法,不僅可以轉換gb2312到unicode,還可以在任意的兩種編碼之間轉換(前提是linux系統要支援這些編碼)。

首先要用 iconv_open(), 開啟乙個轉換控制代碼,指定兩種轉換前的編碼和轉換後的編碼。然後用 icnov() 作轉換。最後用 iconv_close()關閉控制代碼,釋放資源。

char inbuf[buflen];

char outbuf[buflen];

char* pin = inbuf;

char* pout = outbuf;

//開啟檔案,讀入gb2312資料到inbuf,資料長度為 len

int inleft = len;

int outleft = buflen;

iconv_t cd;

if((cd = iconv_open(「gb2312」, 「unicode」)) == (iconv_t)-1)

return 1;

if(iconv(cd, &pin, &inleft, &pout, &outleft) == (size_t)-1)

return 1;

iconv_close(cd);

使用 iconv () 時,需要注意引數的使用,inleft 是輸入緩衝區資料資料長度,outleft是輸出緩衝區大小。(需要保證輸出緩衝區足夠大)。轉換以後,outleft 是outbuf中空閒空間的大小,所以 buflen-outleft 才是真正的unicode資料長度。

注意:不論是gb2312編碼,還是unicode編碼,在記憶體中都是一些位元組序列,所以我們可以統一用 型別為 char(或者unsigned char)的字元陣列來儲存。所以,buflen-outleft是 字元(char)個數,而不是unicode字元個數。

2、 unicode 編碼到 16-bit 編碼的轉換

在得到 unicode編碼以後,還需要轉換到 pdu 的16-bit 編碼,才可以正確的傳送。在這個轉換過程中,需要注意兩點:

1)、unicode 編碼最開始的 0xfeff標誌要被去除,在0xfeff之後的內容,才是真正的unicode字元。(至於為什麼有這個0xfeff標誌,知道的朋友告訴我一聲,呵呵)。

2)、unicode 是雙位元組字元,由於我的系統是小端位元組序(little-endian),也就是說,在儲存的時候,是先低位,後高位,例如「中」的unicode編碼是 0x4e2d,儲存的時候是 2d4e,在轉換到 16-bit編碼的時候,要注意這個順序的不同。當然,如果你的系統是大端位元組序(big-endian),那麼就不用這樣做了。

3)、為了將0x4e2d 的unicode編碼轉換到 「4e2d」 的16-bit編碼,可以用 sprintf(buf, 「%02x」, outbuf[i]) 對每乙個位元組作轉換。

3、正確計算16-bit 編碼的訊息體長度

pdu規範中,需要包括訊息體的長度,這裡你要小心計算。

4、正確設定 first-octet 、tp-mr、tp-pid、tp-dcs、tp-vp

在pdu格式中,first-octet 、tp-mr、tp-pid、tp-dcs、tp-vp的設定正確與否,對能否傳送 unicode 至關重要。根據協議規範以及我的除錯結果,以上幾個標誌的正確設定分別為(都是16進製制):

first-octet : 11

tp-mr: 00

tp-pid: 00

tp-dcs: 08 (編碼方式,16-bit)

tp-vp: a7

經過以上步驟,已經可以做到傳送中文字元了。

linux

posted @

2019-04-15 22:39

心靈捕手 閱讀(

...)  

編輯收藏

Android 簡訊應用 簡訊傳送2

之前,有一片關於簡訊傳送的文章,不過那篇文章所提到的方法,是不會把簡訊存放到發件箱中的。介於有些時候需要存入,那麼我把相關的 寫出來 只要把這幾句加入方法中,再加上需要的許可權,那麼簡訊發出去後,發件箱就有所發簡訊內容了。如下 contentvalues values new contentvalu...

簡訊傳送 簡訊傳送流程 應用層

簡訊傳送流程應用層解析 com.android.mms.ui.composemessageactivity com.android.mms.data.workingmessage com.android.mms.transaction.messagesender com.android.mms.tr...

eie傳送簡訊

1.開啟乾淨eie 如d 需要的檔案 2.拷貝到c盤 eie 1.d 20130710db bak eie1 infox proagent license pro serr覆蓋c eie eie descript 1 6sql語句用查詢分析器執行 第6個報錯不管 2.執行installseri.ba...