メール猫ソフトの実現(C#)7 bitPDUのコード

15047 ワード

前の时间は简単なクラスライブラリを完成して、メールの猫のメールの送信と受信を完成することができますが、クラスライブラリはまだ完璧ではありません.例えば、英語のメールの送信はUSC 2コードで、1つのメールに最大70文字を送信できます.7 bitで符号化すれば1本あたり160文字を送信することができ、本稿では前のクラスにPDUの符号化を加えた.
  • スキーム:以前と同様に、一部のコードのみが追加されています.PDUクラスは、UserDataのsetアクセサを変更し、7 bit符号化を完了するとともに、7 bit符号化関数を追加します.プログラムの可読性を向上させるために、関数名の一部を変更しました.GSMModemクラスがSendMsgに加わるリロードは、7 bit符号化かUSC 2符号化かを判断するパラメータを加える.具体的な方案は前の文章を参照する:ショートメール猫ソフトの実現(C#)<四>PDUフォーマットコードC#実現 ショートメール猫ソフトの実現(C#)<5>PDUフォーマット復号C#実現 ショートメール猫ソフトの実現(C#)<六>受信メールの送信C#実現(API)
  • PDUクラス:
  • UserDataプロパティ:UserDataは、7 bit符号化符号化アルゴリズム:高低交換のためにsetアクセサのみを変更し、高さ8ビットごとに1文字とすればよい.例:Test:T:0101010100 e:0101100101 s:011110011 t:011110100最高位0に行き、7ビットT:101010100 e:1100101 s:1100101 t:110100高低位交換:tseT 1110100 1110011 1100101 1010100高位から8ビットごとに1ビットグループに取る:1 1010100 11 110010 100 11100 D 4 F 29 C 0 E符号化完了!ソースコードは次のとおりです.
     1:  set
     2:   {
     3:      if (DataCodingScheme == "08" || DataCodingScheme == "18")           //USC2   : USC2
      4:      {
     5:          userData = string.Empty;
     6:          Encoding encodingUTF = Encoding.BigEndianUnicode;
     7:   
     8:          byte[] Bytes = encodingUTF.GetBytes(value);
     9:   
    10:          for (int i = 0; i < Bytes.Length; i++)
    11:          {
    12:              userData += BitConverter.ToString(Bytes, i, 1);
    13:          }
    14:          userDataLenghth = (userData.Length / 2).ToString("X2");
    15:      }
    16:      else                                                                //7bit      7bit 
    17:      {
    18:          userData = string.Empty;
    19:          userDataLenghth = value.Length.ToString("X2");                  //7bit   : 
    20:   
    21:          Encoding encodingAsscii = Encoding.ASCII;
    22:          byte[] bytes = encodingAsscii.GetBytes(value);
    23:   
    24:          string temp = string.Empty;                                     //   
    25:          string tmp;
    26:          for (int i = value.Length; i > 0; i--)                          //   
    27:          {
    28:              tmp = Convert.ToString(bytes[i - 1], 2);
    29:              while (tmp.Length < 7)                                      // 7 , 
    30:              {
    31:                  tmp = "0" + tmp;
    32:              }
    33:              temp += tmp;
    34:          }
    35:   
    36:          for (int i = temp.Length ; i > 0; i -= 8)                    // 8     
    37:          {
    38:              if (i > 8)
    39:              {
    40:                  userData += Convert.ToInt32(temp.Substring(i-8, 8), 2).ToString("X2");
    41:              }
    42:              else
    43:              {
    44:                  userData += Convert.ToInt32(temp.Substring(0, i), 2).ToString("X2");
    45:              }
    46:          }
    47:   
    48:      }
    49:  }

    <!--
    .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を読み込むだけで対応部分の符号化が完了します.
    PDU 7 BitEncoder関数:7 bit符号化メソッドコードを新たに追加すると以下のようになります.
     1:  public string PDU7BitEncoder(string phone, string Text)
     2:  {
     3:      if (Text.Length > 160)
     4:      {
     5:          throw new Exception(" 160");
     6:      }
     7:      dataCodingScheme = "00";
     8:      DestinationAddress = phone;
     9:      UserData = Text;
    10:   
    11:      return serviceCenterAddress + protocolDataUnitType
    12:          + messageReference + destinationAddress + protocolIdentifer
    13:          + dataCodingScheme + validityPeriod + userDataLenghth + userData;
    14:  }

    <!--
    .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の復号を直接返す.
    その他の変更:
    1:  public string PDUUSC2Encoder(string phone, string Text)

    <!--
    .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}
    -->
    従来のメソッド名はPDUencoderからPDUUSC 2 Encoderに変更され、プログラムの読み取りが向上しました.
  • GSMModemクラス:
  • 列挙:メールタイプ(USC 2コードか7 bitコードか)を区別しやすいように列挙タイプを加える
    1:  public enum MsgType { AUSC2, A7Bit };              //    AUSC2 A7Bit:7  ( AUSC2,   7Bit 160 ,USC2 70)

    <!--
    .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}
    -->
    ネーミングスペースGSMMODEMに列挙タイプMsgTypeを加える
    SendMsgリロード:
     1:  public void SendMsg(string phone, string msg, MsgType msgType)
     2:  {
     3:      if (msgType == MsgType.AUSC2)
     4:      {
     5:          SendMsg(phone, msg);
     6:      }
     7:      else
     8:      {
     9:   
    10:      }
    11:  }

    <!--
    .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}
    -->
    タイプがAUSSC 2であれば、元の送信方法を呼び出してUSC 2でメールを符号化し、A 7 BitタイプであればPDUencodingクラスの7 bit符号化関数で、プログラムはまだ実装されていないので、次のブログで詳細なソースコードを提供しますもちろん、元のPDUクラスの符号化方法を呼び出す場所は相応に変更します.
    添付資料:プロジェクトファイル