【问题标题】:Check if C# byte array contains a String检查 C# 字节数组是否包含字符串
【发布时间】:2016-07-05 08:54:56
【问题描述】:

有没有办法检查 byte[] 中的字节是否是一个有效的字符串,所以它是否只包含 ASCII 字符。

if (isValidASCII(myByteArray)) {
....
}

我可以像上面的示例一样使用但具有功能的东西。

【问题讨论】:

  • 如何定义一个有效的字符串?编码应该是什么?你试过什么?
  • 您在提供的代码中缺少一个关闭制动
  • 所有字节数组都包含有效字符串,因为所有字符串都是字节数组,但是有效并不意味着有意义,要回答我们需要知道您将什么归类为有意义
  • 您可能不会尝试做任何有用的事情。如果我不得不冒险猜测,您正在查看一个 Byte[] 表示非 ascii 编码的文本,如果您期望一些“有效”字符,可能是 UTF-8。为了做一些有用的事情,您需要弄清楚文本是如何编码的,并使用正确的解码器来获取字符串。你现在走的路只会带来痛苦。

标签: c# string byte bytearray


【解决方案1】:

如果

仅包含 ASCII 字符

表示代码在[32..127] 内的符号(对应字符为[' '..'~'])- 标准ASCII 表字符,不包括命令字符:

Boolean isAscii = myByteArray.All(b => b >= 32 && b <= 127)

然而,一个有效的字符串被这样定义很可能是

 "$d|1 ?;)y" // this is a valid ASCII characters based string

或类似的。如果你想把这个简单的 Linq 包装成一个方法:

  public static bool isValidASCII(IEnumerable<byte> source) {
    if (null == source)
      return true; // or false, or throw exception

    return source.All(b => b >= 32 && b <= 127);
  }

  ...

  if (isValidASCII(myByteArray)) {
     ...
  }

【讨论】:

  • 在包含低字节之前我无法得到结果:回车、制表符等。因此,为了简化,这已经足够了:return source.All(b => b
【解决方案2】:

从字面上回答你的问题:

是的。这不仅非常简单,而且微不足道:

Boolean isValidAscii(Byte[] bytes) {
  return true;
}

这很可能不是您想要的。

ASCII 是一个将每个字节映射到一个字符的表。根据定义,每个字节代表一个有效的 ASCII 字符。

所以问题真的是,你在寻找什么?您认为什么是有效的 ASCII 字符。

一旦定义好,就很容易编码:

Boolean iFindThisAValidAsciiCharacter(Char c) {
  //your logic here
}

Boolean isValidAscii(Byte[] bytes) {
  return bytes.forAll((Byte b) => iFindThisAValidAscciCharacter( (char)b))
}

当然,诀窍在于你对你认为有效的东西的定义。

我建议您退后一步,首先考虑一下您为什么需要“有效的 ascii”。在这个充满国际化和 unicode 的勇敢新世界中,您尝试做的事情似乎不太可能完成您想要完成的事情。

【讨论】:

    【解决方案3】:

    首先,您可以使用此方法将字节数组转换为字符串

    System.Text.Encoding.ASCII.GetString(BytesArray);
    

    然后检查它是否有效。

    【讨论】:

    • 这个函数只会将值大于 127 的字节替换为 "?"
    【解决方案4】:
    string asciiString = Encoding.ASCII.GetString(Encoding.ASCII.GetBytes(BYTEVARIABLE));
    

    现在检查字符串中是否有一些字符已更改为“?”如果是,则不仅仅是 ASCII。

    【讨论】:

      猜你喜欢
      • 2015-02-07
      • 1970-01-01
      • 2022-06-30
      • 1970-01-01
      • 2021-12-14
      • 2012-06-27
      • 2021-12-20
      • 2011-02-24
      • 2013-11-20
      相关资源
      最近更新 更多