如何从C#字符串中获取空终止字符串?

时间:2010-05-08 09:37:01

标签: c# string null-terminated

  • 我正在与需要空终止字符串的服务器进行通信
  • 我怎样才能在C#中做到聪明地

4 个答案:

答案 0 :(得分:39)

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

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

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

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

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

答案 1 :(得分:13)

我假设您正在实现某种二进制协议,如果字符串为空终止。您使用的是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

答案 2 :(得分:8)

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

但是,.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数组全部用零填充,因此您不必将额外字节实际设置为零。)

答案 3 :(得分:5)

在字符串的末尾添加一个空字符。 .NET字符串可以包含空字符。