2013-09-05 3 views
4

У меня, похоже, проблемы с моими преобразованиями строк в C#. Мое приложение получило массив байтов, состоящий из строки ASCII (один байт на символ). К сожалению, он также имеет 0 в первом месте. Итак, как мне преобразовать этот массив байтов в строку C#? Ниже приведен пример данных Я пытаюсь преобразовать:Преобразование ASCII в массив байтов в строку

byte[] exampleByteArray = new byte[] { 0x00, 0x52, 0x50, 0x4D, 0x20, 0x3D, 0x20, 0x32, 0x35, 0x35, 0x2C, 0x36, 0x30, 0x0A, 0x00 }; 
string myString = null; 

Я сделал несколько неудачных попыток, так думал, я хотел бы попросить о помощи. В конце концов мне нужно добавить строку в ListBox:

listBox.Items.Add(myString); 

Нужный выход в ListBox: «RPM = 255630» (с или без перевода строки). Массив байт будет переменной длины, но всегда будет завершаться 0x00

ответ

9
byte[] exampleByteArray = new byte[] { 0x00, 0x52, 0x50, 0x4D, 0x20, 0x3D, 0x20, 0x32, 0x35, 0x35, 0x2C, 0x36, 0x30, 0x0A, 0x00 }; 
exampleByteArray = exampleByteArray.Where(x=>x!=0x00).ToArray(); // not sure this is OK with your requirements 
string myString = System.Text.Encoding.ASCII.GetString(exampleByteArray).Trim(); 

Результат:

RPM = 255,60

Вы можете добавить это к listBox

listBox.Items.Add(myString); 

Обновление:

Согласно новому комментарию массив байтов может содержать мусор после конечного 0x00 (остатки предыдущих строк).

Вам необходимо пропустить первый 0x00, а затем рассмотреть байты, пока не получите 0x00, так что вы можете использовать силу Linq для выполнения этой задачи. например ASCII.GetString(exampleByteArray.Skip(1).TakeWhile(x => x != 0x00).ToArray())

+0

О, так близко! Я забыл упомянуть, что массив байтов может содержать мусор после конечного 0x00 (остатки предыдущих строк) ... –

+0

Это, безусловно, превосходит цикл for, THANKS! –

0
byte[] exampleByteArray = new byte[] { 0x00, 0x52, 0x50, 0x4D, 0x20, 0x3D, 0x20, 0x32, 0x35, 0x35, 0x2C, 0x36, 0x30, 0x0A, 0x00 }; 
string myString = System.Text.ASCIIEncoding.Default.GetString(exampleByteArray); 

Результат: myString = "\0RPM = 255,60\n\0"

0
var buffer = new byte[] { 0x00, 0x52, 0x50, 0x4D, 0x20, 0x3D, 0x20, 0x32, 0x35, 0x35, 0x2C, 0x36, 0x30, 0x0A, 0x00 } 
    .Skip(1) 
    .TakeWhile(b => b != 0x00).ToArray(); 

Console.WriteLine(System.Text.Encoding.ASCII.GetString(buffer)); 
Смежные вопросы