Как получить строку с нулевым завершением из строки 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 заполнен с нулями при создании, поэтому вам не нужно фактически устанавливать дополнительный байт в ноль.)


добавить нулевой символ в конец строки. Строки .NET могут содержать нулевые символы.