19
  • 我正在与需要空终止字符串的服务器通信
  • 如何在 C# 中巧妙地做到这一点?
4

4 回答 4

51

我认为聪明的方法是简单地做到这一点。

string str = "An example string" + char.MinValue; // Add null terminator.

然后将其转换为字节发送到服务器。

byte[] buffer = ASCIIEncoding.ASCII.GetBytes(str);

当然,您使用的编码取决于服务器期望的编码。

于 2010-05-08T14:04:57.770 回答
15

我假设你正在实现某种二进制协议,如果字符串是空终止的。你在用BinaryWriter吗?

默认BinaryWriter将字符串作为长度前缀写入。您可以更改该行为:

class MyBinaryWriter : BinaryWriter
{
    private Encoding _encoding = Encoding.Default;

    public override void Write(string value)
    {
        byte[] buffer = _encoding.GetBytes(value);
        Write(buffer);
        Write((byte)0);
    }
}

然后你可以像这样写任何字符串:

using (MyBinaryWriter writer = new MyBinaryWriter(myStream))
{
    writer.Write("Some string");
}

您可能需要根据需要调整_encoding位。

您当然可以根据您可能需要传输的其他数据类型的特定需求来扩展该类,从而使您的实际协议实现保持良好和干净。您可能还需要自己的(非常相似)BinaryReader

于 2010-05-08T09:54:24.440 回答
7

字符串已经以 null 结尾。尽管字符串本身不包含空字符,但空字符始终跟随在内存中的字符串之后。

但是,.NET 中的字符串是 unicode,因此它们以 UTF-16/UCS-2 的形式存储在内存中,并且服务器可能需要不同的编码,通常是 8 位编码。然后您必须将字符串编码为字节数组并在末尾放置一个零字节:

byte[] data = Encoding.Default.GetBytes(theString);
byte[] zdata = new byte[data.Length + 1];
data.CopyTo(zdata, 0);

(zdata 数组在创建时全部用零填充,因此您不必实际将额外的字节设置为零。)

于 2010-05-08T09:51:42.673 回答
5

您将空字符添加到字符串的末尾。.NET 字符串可以包含空字符。

于 2010-05-08T09:40:48.577 回答