字节数组中的字符串不会在 C# 中被修剪?
Posted
技术标签:
【中文标题】字节数组中的字符串不会在 C# 中被修剪?【英文标题】:String from byte array doesn't get trimmed in C#? 【发布时间】:2010-11-27 00:29:40 【问题描述】:我有一个类似这样的字节数组(16字节):
71 77 65 72 74 79 00 00 00 00 00 00 00 00 00 00
我用它把它转换成字符串并修剪结尾的空格:
ASCIIEncoding.ASCII.GetString(data).Trim();
我得到的字符串很好,但是它仍然有所有的结尾空格。
所以我得到了类似"qwerty.........."
的东西(由于 ***,点是空格)。
我做错了什么?
我也尝试使用 .TrimEnd() 并使用 UTF8 编码,但它并没有改变任何东西。
提前致谢:)
【问题讨论】:
你的字节数组是以 00 字节还是 20 字节结尾的?空格是 0x20 而不是 0x00。 如果您的字节数组来自 MemoryStream,请确保您调用ToArray()
而不是 GetBuffer()
,因为 GetBuffer 将包含“未填充”数据,从而导致所有这些 `\0's
【参考方案1】:
您必须执行TrimEnd(new char[] (char)0 );
才能解决此问题。这不是空格 - 它实际上是奇怪地转换的空字符。我也有这个问题。
【讨论】:
空终止符与 ASCII 编码无关。似乎@Lazlo 有一个固定大小的字节数组,其中包含一个可变长度的 ASCII 编码字符串,因此必须用空终止符填充该字符串以匹配数组大小 谢谢 :) 我以为是这样的,但不敢尝试。 其实.TrimEnd('\0')
就可以了。
@dtb 你能详细说明一下吗?为什么结果字符串要与数组大小匹配?零不是 ASCII 字符,因此从逻辑上讲,这些应该被忽略,也就是修剪掉,并且字符串应该比数组短。【参考方案2】:
它们并不是真正的空间:
System.Text.Encoding.ASCII.GetString(byteArray).TrimEnd('\0')
...应该可以解决问题。
-奥辛
【讨论】:
【参考方案3】:默认修剪removes only whitespace,其中空格由char.IsWhitespace
定义。
'\0'
是控制字符,而不是空格。
您可以使用 Trim(char[])
重载指定要修剪的字符:
string result = Encoding.ASCII.GetString(data).Trim(new char[] '\0' );
【讨论】:
【参考方案4】:为什么要先创建字符串然后修剪它?这可能会增加很多开销(如果 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
【讨论】:
【参考方案5】:在powershell中,你可以这样做:
$yourString.TrimEnd(0x00)
【讨论】:
以上是关于字节数组中的字符串不会在 C# 中被修剪?的主要内容,如果未能解决你的问题,请参考以下文章