Получение строки с нулевым завершением из System.Text.Encoding.Unicode.GetString

StackOverflow https://stackoverflow.com/questions/864246

Вопрос

У меня есть массив байтов, который я получаю от внешнего объекта.Это фиксированный размер.Байты содержат строку 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);
Лицензировано под: CC-BY-SA с атрибуция
Не связан с StackOverflow
scroll top