Строка из байтового массива не обрезается в C #? - PullRequest
22 голосов
/ 10 сентября 2009

У меня есть байтовый массив, подобный этому (16 байтов):

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, но это ничего не меняет.

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

Ответы [ 5 ]

32 голосов
/ 10 сентября 2009

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

22 голосов
/ 10 сентября 2009

Они на самом деле не пробелы:

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

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

-Oisin

7 голосов
/ 10 сентября 2009

Trim по умолчанию удаляет только пробел , где пробел определяется как char.IsWhitespace.

'\0' является управляющим символом, а не пробелом.

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

string result = Encoding.ASCII.GetString(data).Trim(new char[] { '\0' });
1 голос
/ 26 марта 2014

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

$yourString.TrimEnd(0x00)
1 голос
/ 26 июля 2011

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

Вы можете указать 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
...