ショートメール猫ソフトの実現(C#)7 bitPDUの復号化
12208 ワード
先日実装されたクラスライブラリでは、ASCIIコードを受信し、7 bitコードのメールが読み取ったメールの内容が文字化けしているという深刻な問題があり、コントロールが使用できません.クラスライブラリには対応する復号プログラムがなく,すべてUSC 2の符号化による復号であるためである.本文で紹介したプログラムはこの部分のコードに参加してこの問題を解決して、前の工事プロジェクトのファイルは同時にこの部分の内容を更新して、必要なのはダウンロードを歓迎します.
まずPDUの7 bit符号化を見る:PDU符号化詳細はメール猫ソフトの実現(C#)<三>PDU形式メール解析を参照
英文コード:7 bit符号化、次のビットの後のビットを順に前に移動して新しい8ビット符号化を形成する例:Test T:0100100 e:0101100101 s:0110001 t:011110100最上位0を除去し、7ビットT:101010100 e:110010101 s:110011 t:110100になる下位ビットが前面に移動8ビット符号化Test:1010100111100010011100001110 UD:D 4 F 29 C 0 E UDL:04
復号アルゴリズム:サイクルの使用;ビットグループ(バイトバッファに格納された)をループごとに読み出す.バイナリ文字列に変換し、下位ビットと前のビットグループに対応する残りのバイナリビットを取って7 bit ASCIIコードを構成し、結果配列を加える.
<!--
.codearea{ color:black; background-color:white; line-height:18px; border:1px solid #4f81bd; margin:0; width:auto !important; width:100%; overflow:auto; text-align:left; font-size:12px; font-family: "Courier New","Consolas","Fixedsys","BitStream Vera Sans Mono", courier,monospace,serif}
.codearea pre{ color:black; line-height:18px; padding:0 0 0 12px !important; margin:0em; background-color:#fff !important}
.linewrap pre{white-space:pre-wrap; white-space:-moz-pre-wrap; white-space:-pre-wrap; white-space:-o-pre-wrap; word-wrap:break-word; word-break:normal}
.codearea pre.alt{ background-color:#f7f7ff !important}
.codearea .lnum{color:#4f81bd;line-height:18px}
-->
クラスライブラリのその他の変更: UserData getアクセサ:このコードの呼び出しを追加します.
<!--
.codearea{ color:black; background-color:white; line-height:18px; border:1px solid #4f81bd; margin:0; width:auto !important; width:100%; overflow:auto; text-align:left; font-size:12px; font-family: "Courier New","Consolas","Fixedsys","BitStream Vera Sans Mono", courier,monospace,serif}
.codearea pre{ color:black; line-height:18px; padding:0 0 0 12px !important; margin:0em; background-color:#fff !important}
.linewrap pre{white-space:pre-wrap; white-space:-moz-pre-wrap; white-space:-pre-wrap; white-space:-o-pre-wrap; word-wrap:break-word; word-break:normal}
.codearea pre.alt{ background-color:#f7f7ff !important}
.codearea .lnum{color:#4f81bd;line-height:18px}
--> 元のコードにはDCSが使用されていません(復号時)、現在追加する必要があります: 復号関数:DCS書き込み を追加
また変わった
<!--
.codearea{ color:black; background-color:white; line-height:18px; border:1px solid #4f81bd; margin:0; width:auto !important; width:100%; overflow:auto; text-align:left; font-size:12px; font-family: "Courier New","Consolas","Fixedsys","BitStream Vera Sans Mono", courier,monospace,serif}
.codearea pre{ color:black; line-height:18px; padding:0 0 0 12px !important; margin:0em; background-color:#fff !important}
.linewrap pre{white-space:pre-wrap; white-space:-moz-pre-wrap; white-space:-pre-wrap; white-space:-o-pre-wrap; word-wrap:break-word; word-break:normal}
.codearea pre.alt{ background-color:#f7f7ff !important}
.codearea .lnum{color:#4f81bd;line-height:18px}
-->
文.元はサブ文字列長がありましたが、7 bit符号化とUSC 2符号長の計算が異なるため、このパラメータを外して文字列の末尾に直接取ります.現在、機能はまだ強くありませんが、使用可能なクラスライブラリが完了しました.変更箇所:7 bitコードの加入など;現在、ASCIIコードメールの送信にもUSC 2コードが使用されており、明らかにスペースがもったいない(7 bitコード1メール160文字、USC 2 70文字).
前編で実現した猫プログラムが7 bit符号化(受信のみ)を認識できるようにするには、今日生成したDLLファイルを前編用のファイルに上書きすればよいので、他の場所は変更する必要はありません.
皆さん、ご支持ありがとうございます.貴重な意見を歓迎します.
更新部分:復号関数whileループ、do-whileループに変更し、英語文字が1つしか受信されていない場合、復号内容が空の問題を解決する2011-04-11ファイル修正後の内容は:
添付資料:プロジェクトファイル
まずPDUの7 bit符号化を見る:PDU符号化詳細はメール猫ソフトの実現(C#)<三>PDU形式メール解析を参照
英文コード:7 bit符号化、次のビットの後のビットを順に前に移動して新しい8ビット符号化を形成する例:Test T:0100100 e:0101100101 s:0110001 t:011110100最上位0を除去し、7ビットT:101010100 e:110010101 s:110011 t:110100になる下位ビットが前面に移動8ビット符号化Test:1010100111100010011100001110 UD:D 4 F 29 C 0 E UDL:04
復号アルゴリズム:サイクルの使用;ビットグループ(バイトバッファに格納された)をループごとに読み出す.バイナリ文字列に変換し、下位ビットと前のビットグループに対応する残りのバイナリビットを取って7 bit ASCIIコードを構成し、結果配列を加える.
1: private string PDU7bitDecoder(string userData)
2: {
3: string result = string.Empty;
4: byte[] b = new byte[100];
5: string temp = string.Empty;
6:
7: for (int i = 0; i < userData.Length; i += 2)
8: {
9: b[i / 2] = (byte)Convert.ToByte((userData[i].ToString() + userData[i + 1].ToString()),16);
10: }
11:
12: int j = 0; //while
13: int tmp = 1; //temp
14: while (j < userData.Length / 2 - 1)
15: {
16: string s = string.Empty;
17:
18: s = Convert.ToString(b[j], 2);
19:
20: while (s.Length < 8) //s 8 byte 8 ,
21: {
22: s = "0" + s;
23: }
24:
25: result += (char)Convert.ToInt32(s.Substring(tmp) + temp, 2); // temp
26:
27: temp = s.Substring(0, tmp); //
28:
29: if (tmp > 6) // 7 ,
30: {
31: result += (char)Convert.ToInt32(temp, 2);
32: temp = string.Empty;
33: tmp = 0;
34: }
35:
36: tmp++;
37: j++;
38:
39: if (j == userData.Length / 2 - 1) //
40: {
41: result += (char)Convert.ToInt32(Convert.ToString(b[j], 2) + temp, 2);
42: }
43: }
44: return result;
45: }
<!--
.codearea{ color:black; background-color:white; line-height:18px; border:1px solid #4f81bd; margin:0; width:auto !important; width:100%; overflow:auto; text-align:left; font-size:12px; font-family: "Courier New","Consolas","Fixedsys","BitStream Vera Sans Mono", courier,monospace,serif}
.codearea pre{ color:black; line-height:18px; padding:0 0 0 12px !important; margin:0em; background-color:#fff !important}
.linewrap pre{white-space:pre-wrap; white-space:-moz-pre-wrap; white-space:-pre-wrap; white-space:-o-pre-wrap; word-wrap:break-word; word-break:normal}
.codearea pre.alt{ background-color:#f7f7ff !important}
.codearea .lnum{color:#4f81bd;line-height:18px}
-->
クラスライブラリのその他の変更:
1: get
2: {
3: int len = Convert.ToInt32(userDataLenghth, 16) * 2;
4: string result = string.Empty;
5:
6: if (dataCodingScheme == "08" || dataCodingScheme == "18") //USC2
7: {
8: // , USC2
9: for (int i = 0; i < len; i += 4)
10: {
11: string temp = userData.Substring(i, 4);
12:
13: int byte1 = Convert.ToInt16(temp, 16);
14:
15: result += ((char)byte1).ToString();
16: }
17: }
18: else
19: {
20: result = PDU7bitDecoder(userData); 7bit
21: }
22:
23: return result;
24: }
<!--
.codearea{ color:black; background-color:white; line-height:18px; border:1px solid #4f81bd; margin:0; width:auto !important; width:100%; overflow:auto; text-align:left; font-size:12px; font-family: "Courier New","Consolas","Fixedsys","BitStream Vera Sans Mono", courier,monospace,serif}
.codearea pre{ color:black; line-height:18px; padding:0 0 0 12px !important; margin:0em; background-color:#fff !important}
.linewrap pre{white-space:pre-wrap; white-space:-moz-pre-wrap; white-space:-pre-wrap; white-space:-o-pre-wrap; word-wrap:break-word; word-break:normal}
.codearea pre.alt{ background-color:#f7f7ff !important}
.codearea .lnum{color:#4f81bd;line-height:18px}
--> 元のコードにはDCSが使用されていません(復号時)、現在追加する必要があります:
1: dataCodingScheme = strPDU.Substring(lenSCA + lenOA + 4, 2); //DCS , 7bit
また変わった
1: userData = strPDU.Substring(lenSCA + lenOA + 22);
<!--
.codearea{ color:black; background-color:white; line-height:18px; border:1px solid #4f81bd; margin:0; width:auto !important; width:100%; overflow:auto; text-align:left; font-size:12px; font-family: "Courier New","Consolas","Fixedsys","BitStream Vera Sans Mono", courier,monospace,serif}
.codearea pre{ color:black; line-height:18px; padding:0 0 0 12px !important; margin:0em; background-color:#fff !important}
.linewrap pre{white-space:pre-wrap; white-space:-moz-pre-wrap; white-space:-pre-wrap; white-space:-o-pre-wrap; word-wrap:break-word; word-break:normal}
.codearea pre.alt{ background-color:#f7f7ff !important}
.codearea .lnum{color:#4f81bd;line-height:18px}
-->
文.元はサブ文字列長がありましたが、7 bit符号化とUSC 2符号長の計算が異なるため、このパラメータを外して文字列の末尾に直接取ります.
前編で実現した猫プログラムが7 bit符号化(受信のみ)を認識できるようにするには、今日生成したDLLファイルを前編用のファイルに上書きすればよいので、他の場所は変更する必要はありません.
皆さん、ご支持ありがとうございます.貴重な意見を歓迎します.
更新部分:復号関数whileループ、do-whileループに変更し、英語文字が1つしか受信されていない場合、復号内容が空の問題を解決する2011-04-11ファイル修正後の内容は:
在梅尔猫软件的实现(C#)系列品牌中
添付資料:プロジェクトファイル