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)
当然,您使用的编码取决于服务器所期望的编码.
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.
字符串已经空终止.尽管字符串本身不包含空字符,但空字符始终跟在内存中的字符串之后.
但是,.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数组全部用零填充,因此您不必将额外字节实际设置为零.)
| 归档时间: |
|
| 查看次数: |
32065 次 |
| 最近记录: |