2012-03-01 9 views
1

これは私がやろうとしていることです。私は入ってくるソケットプログラムからバイトデータを取っています。デフォルトでは、エンコードされ、文字列に追加されるために渡されるバイトは1500バイトになります。これは、バイト配列に対して定義したサイズなのでです。私の質問は、1500バイト全体の代わりにバイト配列の一部を渡す方法を知りたいと思います。C#で文字列に移動するバイト数を指定します。

IPAddress localAddr = IPAddress.Parse(args[0]); 
     System.Console.WriteLine("The local IP is {0}", localAddr); 
     Int32 port = int.Parse(args[1]); 
     System.Console.WriteLine("The port is {0}", port); 
     TcpListener myListener = new TcpListener(localAddr, port); 
     byte[] bytes = new byte[1500]; 
     string sem = ""; 
     do 
     { 
      int flag = 0; 
      int rec = 1; 
      Console.Write("Waiting"); 
      myListener.Start(); 
      Socket mySocket = myListener.AcceptSocket(); 
      // receiving the hl7 message 
      StringBuilder sbb = new StringBuilder(); 
      do{ 
      // bytes = null; 
      rec = mySocket.Receive(bytes,SocketFlags.None); 
     //  rec = mySocket.Receive(bytes); 
      Console.WriteLine("rec = {0} ",rec); 
      for (int i=0; i<bytes.Length; i++) 
      { 
       if (bytes[i]==0x1C) 
       { 
       flag = 1; 
       } 
      } 
      sbb.Append(Encoding.ASCII.GetString(bytes)); 

      }while (flag == 0); 
+1

どのような言語ですか?適切なタグを付けてください。 –

+0

申し訳ありません...タイトルが変更されました。 –

+0

私はsbbがStringBuilderであると推測しています。文字列ではありません。そしてあなたの質問は、とにかく意味がありません。なぜ、空のバイト配列を文字列ビルダーに追加したいのですか? –

答えて

5

まず、のコードに示すが何をするかについて明確にしましょう:

  • それは空のバイト配列
  • を作成し、それをは、新しい文字列を作成し、エンコーディングを使用して、この配列からをデコード
  • この文字列を渡してStringBuilderに追加します。

"バイトを文字列にコピー"はしません。文字列は本質的に "char"データ(それぞれ16ビット)であり、バイトデータではありません。バイトデータをcharデータとして扱いたいのであれば、エンディアンに応じてUTF-16で動作しますが、ASCIIでは動作しません。

追加するどのくらいの選択日時:

  • Encoding.GetStringを指定するための過負荷を持っているオフセットとバイトデータの数が
  • StringBuilder.Appendオフセットとカウントを指定するための過負荷を持って検討します考慮する文字データ

どちらかまたは両方がここで便利です。しかし、私はコードがあなたが思うとは思わないと思う。簡単にStringBuilderを初期化する方法があります

+0

返信いただきありがとうございます...私は大量のコード構造を含んでいます。私は比較的新しいコーディングゲームです。 –

+0

@Gregそのインスタンスでは、 'Encoding.ASCII.GetString(bytes、0、rec)'が必要です - 意味がありますか?ああ、 'rec'が'> 0'であることを保証するべきです - もしそれが '<= 0'であれば、受信ストリームが閉じられたことを意味します。あなたは無限ループにこだまれたくありません。また、バッファの 'rec'だけをチェックすべきです:' for(int i = 0; i

+0

私が必要とするような醜い表情のマーク。私はまた、バッファチェックを制限するという提案を使用します。助けてくれてありがとう。このサイトを愛する;) –

関連する問題