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

Bet*_*moo 17 c# string null-terminated

  • 我正在与需要空终止字符串的服务器通信
  • 我怎样才能在C#中巧妙地做到这一点?

Ale*_*ide 42

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

string str = "An example string" + char.MinValue; // Add null terminator.
Run Code Online (Sandbox Code Playgroud)

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

byte[] buffer = ASCIIEncoding.ASCII.GetBytes(str);
Run Code Online (Sandbox Code Playgroud)

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

  • char.MinValue是真正的C#方式 (6认同)
  • 这是迄今为止我发现的最简单(也是最可靠)的方法。这应该是公认的答案。 (2认同)

Tho*_*rin 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);
    }
}
Run Code Online (Sandbox Code Playgroud)

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

using (MyBinaryWriter writer = new MyBinaryWriter(myStream))
{
    writer.Write("Some string");
}
Run Code Online (Sandbox Code Playgroud)

您可能需要_encoding根据需要调整钻头.

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

  • 我建议使用 base.Write(this._encoding.GetBytes(new char[]{ '\u0000'})) 来代替,对空终止符进行编码。默认 UTF-16 为 2 个字节,并且末尾有两个 0 字节。 (2认同)

Guf*_*ffa 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);
Run Code Online (Sandbox Code Playgroud)

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

  • "Null终止"通常表示"以第一个空值结束".如果您还允许.NET字符串可能包含一个或多个空字符但尚未终止,则不能将.NET字符串视为以null结尾 (7认同)
  • @Guffa:Jon的页面似乎与[实际文档](http://msdn.microsoft.com/en-us/library/ms228362.aspx)直接冲突.我认为C#字符串实际上不是以null结尾,编组过程只知道如何对它们进行空终止(我不确定它将如何保留嵌入的空值,或者甚至是否可能). (3认同)

Tom*_*lak 5

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