Получение строки с нулевым символом в конце из System.Text.Encoding.Unicode.GetString - PullRequest
10 голосов
/ 14 мая 2009

У меня есть массив байтов, которые я получаю от внешнего объекта. Это фиксированный размер. Байты содержат строку в кодировке Юникод с 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")?

Спасибо за любой вклад.

Ответы [ 3 ]

12 голосов
/ 14 мая 2009

Если вы уверены, что все остальное \ 0, это будет работать:

cmd = cmd.TrimEnd('\0');

В противном случае, если вы просто хотите получить все до первого нуля:

int index = cmd.IndexOf('\0');
if (index >= 0)
   cmd = cmd.Remove(index);

Обратите внимание, что Unicode.GetString позаботится о двойных \ 0s. Вы должны просто искать один \ 0.

3 голосов
/ 23 марта 2018

Вместо повторной обработки строки вы можете получить первое вхождение нулевого байта в буфере (используя 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);
3 голосов
/ 14 мая 2009

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

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

Если вы не знаете количество символов заранее и хотите избежать обрезки строки после этого, вам нужно сначала обрезать массив байтов, чтобы вы пропускали только те байты, которые вас интересуют. Для Unicode это будет означать удаление любых байтов после и включая первую пару нулей.

...