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