Как получить строку с нулевым завершением из строки С#?

  • Я общаюсь с сервером, которому нужна строка с нулевым завершением
  • Как я могу сделать это умно на С#?

Ответ 1

Я предполагаю, что вы реализуете какой-то двоичный протокол, если строки имеют нулевое завершение. Используете ли вы 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.

Ответ 2

Я думаю, что разумный способ - просто сделать это.

string str = "An example string" + Char.MinValue; // Add null terminator.

Затем преобразуйте его в байты для отправки на сервер.

byte[] buffer = ASCIIEncoding.ASCII.GetBytes(str);

Конечно, какая кодировка вы используете, зависит от того, какую кодировку ожидает сервер.

Ответ 3

Строки уже завершены нулем. Хотя сама строка не содержит нулевой символ, нулевой символ всегда следует за строкой в ​​памяти.

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

Ответ 4

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