Получение строки с нулевым завершением из System.Text.Encoding.Unicode.GetString
Вопрос
У меня есть массив байтов, который я получаю от внешнего объекта.Это фиксированный размер.Байты содержат строку Unicode с 0 значениями для заполнения остальной части буфера:
Таким образом, байты могут быть:
H \0 E \0 L \0 L \0 \0 \0 \0 \0 \0 ... etc
Я получаю этот буфер и конвертирую его в строку следующим образом:
byte[] buffer = new byte[buffSize];
m_dataStream.Read(buffer, 0, buffSize);
String cmd = System.Text.Encoding.Unicode.GetString(buffer);
В ответ я получаю строку, которая выглядит следующим образом:
"HELLO\0\0\0\0\0\0\0\0..."
Как я могу сказать GetString завершить строку при первом нулевом значении Unicode (т. е. чтобы я просто получил ответ «HELLO»)?
Спасибо за любой вклад.
Решение
Если вы уверены, что все остальное \0, это сработает:
cmd = cmd.TrimEnd('\0');
В противном случае, если вы просто хотите получить все до первого нуля:
int index = cmd.IndexOf('\0');
if (index >= 0)
cmd = cmd.Remove(index);
Обратите внимание, что Unicode.GetString
позаботится о двойных \0.Вам следует просто найти один \0.
Другие советы
Самый простой способ — обрезать строку после преобразования, как уже предлагалось.
Если вы заранее знаете количество символов, вы можете использовать перегрузку GetString, которая принимает начальный индекс и количество байтов, чтобы получить правильную строку без обрезки.
Если вы заранее не знаете количество символов и не хотите впоследствии обрезать строку, вам необходимо сначала обрезать массив байтов, чтобы передавать только те байты, которые вас интересуют.Для Unicode это будет означать удаление всех байтов после и включая первую пару нулей.
Вместо повторной обработки строки вы можете получить первое появление нулевого байта в буфере (используя System.Array.IndexOf
).Затем вы можете использовать перегруженный System.Text.Encoding.Unicode.GetString
метод для создания строки до заданного размера буфера.
В приведенном ниже примере также учитывается буфер, не содержащий нулевых байтов:
byte[] buffer = new byte[buffSize];
m_dataStream.Read(buffer, 0, buffSize);
var size = System.Array.IndexOf(buffer, (byte)0);
String cmd = System.Text.Encoding.Unicode.GetString(buffer, 0, size < 0 ? buffSize : size);