【问题标题】:String from byte array doesn't get trimmed in C#?字节数组中的字符串不会在 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.........." 的东西(由于 StackOverflow,点是空格)。

我做错了什么?

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

提前致谢:)

【问题讨论】:

  • 你的字节数组是以 00 字节还是 20 字节结尾的?空格是 0x20 而不是 0x00。
  • 如果您的字节数组来自 MemoryStream,请确保您调用 ToArray() 而不是 GetBuffer(),因为 GetBuffer 将包含“未填充”数据,从而导致所有这些 `\0's

标签: c# arrays string byte trim


【解决方案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)
        

        【讨论】:

          猜你喜欢
          • 1970-01-01
          • 1970-01-01
          • 1970-01-01
          • 1970-01-01
          • 1970-01-01
          • 1970-01-01
          • 1970-01-01
          • 1970-01-01
          • 1970-01-01
          相关资源
          最近更新 更多