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