- Я общаюсь с сервером, которому нужна строка с нулевым завершением
- Как я могу сделать это умно на С#?
Как получить строку с нулевым завершением из строки С#?
Ответ 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 могут содержать нулевые символы.