2012-03-01 67 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

什麼語言?請適當標記。 – 2012-03-01 18:12:11

+0

對不起......標題已更改。 – 2012-03-01 18:21:36

+0

我猜sbb是一個StringBuilder,不是一個字符串,對嗎?無論如何,你的問題並沒有太多意義 - 你爲什麼要將一個空字節數組追加到字符串構建器? – 2012-03-01 18:27:34

回答

5

首先,我們要明確什麼顯示的代碼所做的:

  • 它創建一個空的字節數組
  • 使用的編碼,創建一個新的字符串
  • 解碼此數組
  • 它傳遞該字符串以追加到StringBuilder中

它沒有做的是「將字節複製到一個字符串」 - 至少一個字符串本質上是「char」數據(每個16位),而不是字節數據。如果你想將字節數據當作字符數據處理,那麼它就會爲UTF-16工作(取決於字節順序),而不是ASCII。

重新選擇多少追加:

  • Encoding.GetString具有過載,以指定偏移和字節數據的數量來考慮
  • StringBuilder.Append具有過載,以指定的偏移量和計數要考慮的字符數據

其中之一或兩者在此處可能有用;但是,我認爲代碼不會做你認爲它的作用;有更簡單的方法來初始化StringBuilder

+0

感謝您的回覆......我現在意識到我已經包含了更多的代碼結構。我對編碼遊戲比較陌生。 – 2012-03-01 19:19:53

+0

@Greg在那個例子中,你想'Encoding.ASCII.GetString(bytes,0,rec)' - 有意義嗎?哦,你還應該確保'rec'是'> 0' - 如果它是'<= 0'意味着輸入流被關閉 - 在這種情況下不會有更多的數據來。你不想陷入無限循環。另外:你只應該檢查緩衝區的rec:'for(int i = 0; i 2012-03-01 19:28:56

+0

馬克,看起來像我需要興奮。我也會使用限制緩衝區檢查的建議。非常感謝幫忙。喜歡這個網站;) – 2012-03-01 19:55:50