【问题标题】:C# string won't concatenateC# 字符串不会连接
【发布时间】:2010-10-07 12:58:21
【问题描述】:
// 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 的字符串中。但是,当我尝试将 returndata 与任何内容连接时,不会发生连接。例如:String.Concat(returndata, "test") 返回 returndata,returndata + "test" 也是如此。

有人知道为什么会这样吗?

编辑:Steve W 是正确的;后来我发现returndata.Length总是返回8192。

【问题讨论】:

  • 如果您显示您遇到问题的实际代码会更好。您已经发布了您可以使用的代码,而忽略了您没有使用的代码。
  • 你能包含连接的代码吗?
  • @tacogordito:你检查ns.Read()的返回值了吗?
  • 同意 Anthony 和 Zach 的观点:为什么要省略导致问题的代码!

标签: c# string concatenation


【解决方案1】:

你是将它分配给一个字符串还是返回给它自己?

returndata = string.Concat(returndata, "test");
returndata += "test";

【讨论】:

  • 心理调试 - 一定很喜欢 :)
【解决方案2】:

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

【讨论】:

  • 不只是Concat方法,C#中没有直接修改字符串的方法。每个字符串都是唯一的、不可变的对象。如果你改变一个字符串,它会创建一个新的副本。
  • 这是真的——我的措辞不好。
【解决方案3】:

我认为问题与未跟踪读取的字节总数有关。设置为 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'});

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

【讨论】:

    【解决方案4】:

    我猜一下:

    接收到的字符串包含一个 '\0' 终止符。您应该能够使用调试器进行检查。

    【讨论】:

    • 很好的建议,考虑到上下文。 +1
    • 错了。只有 C 字符串以 null 结尾。
    • @Tanveer:是的,如果发件人是一个包含 '\0' 的 C/C++ 程序怎么办? .NET 不需要 EOS 字符,但可以处理它 - 结果类似于 tacogordito 描述。
    • .net 字符串实际上包含一个 nul 终止符,只是(由于长度值)它也可以包含空值(尽管它在传递给旧样式 C 时将不再按预期工作通过编组功能)
    【解决方案5】:

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

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 2013-08-20
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多