字节数组中的字符串不会在 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) 重载中指定indexcount

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# 中被修剪?的主要内容,如果未能解决你的问题,请参考以下文章

Java:如何“修剪”字节数组?

java和c#的字节数组转换问题

C# 字符串到字节数组的速度

C# 和 Java 中的十六进制到字节数组给出不同的结果

在c#中将字符串转换为字节数组

C#字节数组到字符串数组[重复]