在C#中,从字节数组转换成字符串后无法剪裁空白字符?

22

我有一个类似于这样的字节数组(16个字节):

71 77 65 72 74 79 00 00 00 00 00 00 00 00 00 00
我使用以下代码将其转换为字符串并删除末尾的空格:
ASCIIEncoding.ASCII.GetString(data).Trim();

我成功获取了字符串,但它仍然包含所有结尾空格。

所以我得到类似于"qwerty.........."这样的东西(其中点是由于StackOverflow而产生的空格)。

我做错了什么?

我也尝试过使用.TrimEnd()和使用UTF8编码,但它并没有改变任何东西。

提前感谢 :)


3
你的字节数组是否以00字节或20字节结尾?空格是0x20而不是0x00。 - Will Bickford
1
如果您的字节数组来自MemoryStream,请确保调用ToArray()而不是GetBuffer(),因为GetBuffer将包括“未填充”的数据,导致所有这些\0's - Matt Baker
5个回答

33

你需要执行TrimEnd(new char[] { (char)0 });来解决这个问题。这不是空格 - 实际上是转换异常的空字符。我也遇到了这个问题。


7
空字符终止符与ASCII编码无关。看起来@Lazlo有一个固定大小的字节数组,用于容纳变长的ASCII编码字符串,所以为了与数组大小匹配,需要使用空字符终止符进行填充。 - dtb
谢谢 :) 我想就是这样,但我不敢尝试。 - Lazlo
11
实际上,你可以只使用.TrimEnd('\0') - Nikos C.
@dtb 你能详细解释一下吗?为什么应该将生成的字符串与数组大小匹配?零不是ASCII字符,因此从逻辑上讲应该被忽略,即被修剪掉,字符串应该比数组短。 - Hi-Angel

23

它们并不是真正的空格:

System.Text.Encoding.ASCII.GetString(byteArray).TrimEnd('\0')

...应该能解决问题。

-Oisin


8
默认情况下,Trim 仅删除空格字符,其中空格字符由char.IsWhitespace定义。 '\0'是控制字符,不是空格字符。
您可以使用Trim(char[])重载来指定要删除的字符。
string result = Encoding.ASCII.GetString(data).Trim(new char[] { '\0' });

1
为什么要先创建字符串再进行修剪?这可能会增加很多开销(如果byte[]很大的话)。
你可以在GetString(byte[] bytes, int index, int count)重载中指定index和count。
int count = data.Count(bt => bt != 0); // find the first null
string result = Encoding.ASCII.GetString(data, 0, count); // Get only the characters you want

0
在PowerShell中,您可以这样做:
$yourString.TrimEnd(0x00)

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接