【发布时间】:2010-05-08 09:37:00
【问题描述】:
- 我正在与需要以空字符结尾的字符串的服务器通信
- 如何在 C# 中智能做到这一点?
【问题讨论】:
标签: c# string null-terminated
【问题讨论】:
标签: c# string null-terminated
我认为明智的做法是简单地做。
string str = "An example string" + char.MinValue; // Add null terminator.
然后将其转换为字节发送到服务器。
byte[] buffer = ASCIIEncoding.ASCII.GetBytes(str);
当然,您使用什么编码取决于服务器期望的编码。
【讨论】:
我假设你正在实现某种二进制协议,如果字符串是空终止的。你用的是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。
【讨论】:
if (!value.EndsWith("\0")) value += "\0"; 因此使解决方案独立于编码(你没有担心零的数量)。
字符串已经以空值结尾。虽然字符串本身不包含空字符,但在内存中,空字符总是跟在字符串后面。
但是,.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 字符串可以包含空字符。
【讨论】: