Как получить строку с нулевым завершением из строки C#?
- Я общаюсь с сервером, которому нужна строка с нулевым завершением
- Как я могу это сделать Бойко в C#?
4 ответов
Я предполагаю, что вы реализуете какой-то двоичный протокол, если строки завершены 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
.
Я думаю, умный способ сделать это просто.
string str = "An example string" + char.MinValue; // Add null terminator.
затем преобразуйте его в байты для отправки на сервер.
byte[] buffer = ASCIIEncoding.ASCII.GetBytes(str);
конечно, какую кодировку вы используете, зависит от того, какую кодировку сервер ожидает.
строки уже завершены 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);
(массив zdata заполнен с нулями при создании, поэтому вам не нужно фактически устанавливать дополнительный байт в ноль.)