代码之家  ›  专栏  ›  技术社区  ›  user66222

C字符串不会连接

  •  0
  • user66222  · 技术社区  · 17 年前
    // Reads NetworkStream into a byte buffer.
    
    NetworkStream ns;
    System.Net.Sockets.TcpClient client = new TcpClient();
    
    byte[] receiveBytes = new byte[client.ReceiveBufferSize];
    ns.Read(receiveBytes, 0, (int)client.ReceiveBufferSize);
    String returndata = Encoding.UTF8.GetString(receiveBytes);
    

    我成功地从客户机读取数据,并将结果存储到一个名为ReturnData的字符串中。但是,当我尝试将返回数据与任何内容连接时,不会发生连接。例如:string.concat(returnData,“test”)返回returnData,就像returnData+“test”返回一样。

    有人知道这是为什么吗?

    编辑:Steve W是对的;我后来发现了返回数据。长度总是返回8192。

    5 回复  |  直到 17 年前
        1
  •  4
  •   Steve Wranovsky    17 年前

    我认为这个问题与不跟踪读取的总字节数有关。设置为receiveBufferSize的字节缓冲区可能大于实际读取的字节数。通过考虑实际读取的字节数,然后将其传递给encoding.utf8.getString()方法,您应该得到一个可以连接的有效字符串。下面是一个例子:

    
    NetworkStream ns;
    System.Net.Sockets.TcpClient client = new TcpClient();
    
    byte[] receiveBytes = new byte[client.ReceiveBufferSize];
    int bytesRead = ns.Read(receiveBytes, 0, receiveBytes.Length);
    String returndata = Encoding.UTF8.GetString(receiveBytes,0,bytesRead);
    returndata = returndata.Trim(new char[] {'\0'});
    
    

    还请注意,有关读取空终止符并将其包含在读取的字节中的其他建议也可能是一个问题。我已经包括了一个字符串的修剪,以确保删除空终止符。

        2
  •  5
  •   jhunter    17 年前

    您是将它分配给字符串还是重新分配给它本身?

    returndata = string.Concat(returndata, "test");
    returndata += "test";
    
        3
  •  5
  •   Mike Powell    17 年前

    为了扩展jhunter的答案,concat方法不会改变原始字符串变量的内容,它只是 收益率 连接的结果。如果希望返回数据包含串联的结果,则需要使用 returndata = string.Concat(returndata, "test") .

        4
  •  3
  •   Henk Holterman    17 年前

    我猜一下:

    接收的字符串包含一个\0'终止符。您应该能够用调试程序检查这一点。

        5
  •  2
  •   Frederik Gheysels    17 年前

    字符串是不可变的。 这意味着,当您向字符串中添加(连接)另一个字符串时,您将收到一个新的字符串实例。
    原始字符串本身不会被更改。