我似乎遇到了C#中的字符串转换问题。 我的应用程序收到一个由ASCII字符串组成的字节数组(每个字符一个字节)。不幸的是,它在第一个位置也有0。那么如何将这个字节数组转换为c#字符串呢? 以下是我要转换的数据示例:
byte[] exampleByteArray = new byte[] { 0x00, 0x52, 0x50, 0x4D, 0x20, 0x3D, 0x20, 0x32, 0x35, 0x35, 0x2C, 0x36, 0x30, 0x0A, 0x00 };
string myString = null;
我做了几次不成功的尝试,所以我想请求帮助。 最后我需要将字符串添加到列表框中:
listBox.Items.Add(myString);
listBox中的所需输出:“RPM = 255,630”(带或不带换行符)。 字节数组将是可变长度,但始终以0x00
结束答案 0 :(得分:10)
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())
答案 1 :(得分: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"
答案 2 :(得分: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));