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

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

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

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

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

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

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

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

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

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

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