简体   繁体   中英

Convert ASCII in a byte array to string

I seem to be having problems with my string conversions in C#. My application has received a byte array consisting of an ASCII string (one byte per character). Unfortunately it also has a 0 in the first location. So how do I convert this byte array to ac# string? Below is a sample of the data I am trying to convert:

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

I have made several unsuccessful attempts, so thought I would ask for assistance. Eventually I need to add the string to a listbox:

listBox.Items.Add(myString);

The desired output in the listBox: "RPM = 255,630" (with or without the linefeed). The byte array will be variable length, but will always be terminated with 0x00

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();

Result :

RPM = 255,60

you can add this to listBox

listBox.Items.Add(myString);

Update :

As per new comment byte array can contain garbage after the trailing 0x00 (remnants of previous strings).

You need to skip first 0x00 and then consider bytes until you get 0x00 , so you can use power of Linq to do this task. eg ASCII.GetString(exampleByteArray.Skip(1).TakeWhile(x => x != 0x00).ToArray())

 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);

Result: myString = "\\0RPM = 255,60\\n\\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));

The technical post webpages of this site follow the CC BY-SA 4.0 protocol. If you need to reprint, please indicate the site URL or the original address.Any question please contact:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM