2009-09-09 5 views
22

У меня есть массив байтов, похожее на это (16 байт):Строка из массива байтов не обрезается в C#?

71 77 65 72 74 79 00 00 00 00 00 00 00 00 00 00 

Я использую это, чтобы преобразовать его в строку и обрезать концовка пространства:

ASCIIEncoding.ASCII.GetString(data).Trim(); 

Я получаю строку в порядке, однако он все еще имеет все конечные пространства. Итак, я получаю что-то вроде "qwerty.........." (где точки - это пространства из-за StackOverflow).

Что я делаю неправильно?

Я также пытался использовать .TrimEnd() и использовать кодировку UTF8, но ничего не меняет.

Заранее спасибо :)

+3

конец ли ваш массив байт в 00 байт или 20 байт? Пространство 0x20 не 0x00. –

+1

Если ваш массив байтов поступает из MemoryStream, убедитесь, что вы вызываете 'ToArray()', а не 'GetBuffer()', поскольку GetBuffer будет включать в себя «незаполненные» данные, в результате чего все эти '' 0 –

ответ

31

Вы должны сделать TrimEnd(new char[] { (char)0 });, чтобы исправить это. Это не пробелы - это на самом деле пустые символы, которые преобразуются странно. У меня тоже была эта проблема.

+6

нулевые терминаторы не имеют ничего общего делать с кодировкой ASCII. Кажется, @Lazlo имеет массив байтов фиксированного размера, который содержит закодированную по переменной ASCII строку, поэтому строка должна быть заполнена нулевыми терминаторами, чтобы соответствовать размеру массива – dtb

+0

@dtb: Right. Верно-верно. –

+0

Спасибо :) Я думал, что это что-то вроде этого, но не осмелился попробовать. – Lazlo

20

Они на самом деле не пространства:

System.Text.Encoding.ASCII.GetString(byteArray).TrimEnd('\0') 

... должен сделать трюк.

-Oisin

7

Обрезать по умолчанию removes only whitespace, где пробельные определяется char.IsWhitespace.

'\0' - контрольный символ, а не пробел.

Вы можете указать, какие символы обрезать с помощью Trim(char[]) перегрузки:

string result = Encoding.ASCII.GetString(data).Trim(new char[] { '\0' }); 
1

Зачем пытаться создать строку первой и обрезать ее второй? Это может добавить много накладных расходов (если байт [] большой).

Вы можете указать index и count в перечне GetString(byte[] bytes, int index, int count).

int count = data.Count(bt => bt != 0); // find the first null 
string result = Encoding.ASCII.GetString(data, 0, count); // Get only the characters you want 
0

В PowerShell, вы можете сделать это:

$yourString.TrimEnd(0x00)