- 我正在与需要 null 终止的字符串进行通信的服务器进行通信
- 我该如何在 C# 中 巧妙地 实现这一点呢?
我认为聪明的方法是简单地做。
string str = "An example string" + char.MinValue; // Add null terminator.
然后将其转换为字节以发送到服务器。byte[] buffer = ASCIIEncoding.ASCII.GetBytes(str);
当然,你使用的编码取决于服务器期望的编码。
如果字符串以 null 结尾,我假设你正在实现某种二进制协议。你是否在使用 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";
,从而使解决方案编码无关(您不必担心零的数量)。 - marchewek这些字符串已经以null结尾。虽然字符串本身不包含null字符,但在内存中,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);
char*
值始终指向以 null 结尾的字符串。在获取指向字符串实例 s
的指针 p
的固定语句中,从 p
到 p + s.Length - 1
的指针值表示字符串中字符的地址,而指针值 p + s.Length
总是指向空字符(值为 '\0'
的字符)。 - T S你需要在字符串的末尾添加一个空字符。.NET字符串可以包含空字符。