将字节数组中的 ASCII 转换为字符串

本文关键字:ASCII 转换 字符串 字节 字节数 数组 | 更新日期: 2023-09-27 18:30:24

我似乎在 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);

列表框中所需的输出:"RPM = 255,630"(带或不带换行符)。字节数组的长度是可变的,但始终以 0x00 结尾

将字节数组中的 ASCII 转换为字符串

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

结果:

转速 = 255,60

您可以将其添加到listBox

listBox.Items.Add(myString);

更新:

根据新的注释字节数组可以在尾随0x00(先前字符串的残余)之后包含垃圾。

您需要先跳过0x00,然后考虑字节,直到获得0x00,因此您可以使用 Linq 的强大功能来完成此任务。 例如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);

结果: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));