2010-03-15 2 views
4

У меня есть массив байтов, который может иметь или не иметь нулевые байты в конце его. После преобразования его в строку у меня есть куча пустого пространства в конце. Я попытался использовать Trim(), чтобы избавиться от него, но он не работает. Как я могу удалить все пустое пространство в конце строки после преобразования массива байтов?Каков символ, который представляет нулевой байт после ASCIIEncoding.GetString (byte [])?

Я пишу это C#.

+0

Каковы значения в массиве байтов? И вы уверены, что массив байтов содержит строку ASCII, а не Unicode или UTF-8? –

ответ

2
public string TrimNulls(byte[] data) 
{ 
    int rOffset = data.Length - 1; 

    for(int i = data.Length - 1; i >= 0; i--) 
    { 
     rOffset = i; 

     if(data[i] != (byte)0) break;    
    } 

    return System.Text.Encoding.ASCII.GetString(data, 0, rOffset + 1); 
} 

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

+1

Пожалуйста, добавьте, что ваше решение отлично подходит для кодирования ASCII (как запрошено OP), но будет ужасно нарушено для чего-либо еще. –

+0

Это будет работать. Благодарю. я надеялся, что смогу сделать что-то вроде Trim в результирующей строке, но, думаю, нет. Благодаря! – Brian

+0

Небольшая ошибка с этим решением. Возвращаемое значение должно быть: return System.Text.Encoding.ASCII.GetString (данные, 0, rOffset + 1); В противном случае он отключит последний байт. – Brian

6

Trim() не работает в вашем случае, поскольку он удаляет только пробелы, вкладки и символы новой строки AFAIK. Он не удаляет символ '\ 0'. Вы также можете использовать что-то вроде этого:

byte [] bts = ...;

string result = Encoding.ASCII.GetString (bts) .TrimEnd ('\ 0');

+0

Возможно, не самый эффективный для меня (с 20 КБ «0»), но работал как шарм. благодаря –

Смежные вопросы