【问题标题】:Convert charArray to byteArray将 charArray 转换为 byteArray
【发布时间】:2025-12-20 14:20:13
【问题描述】:

我有一个字符串在任何情况下都满足([a-zA-Z0-9])*,我想让它通过sha1。

那么如何将字符串(或者使用ToCharArray()得到的char数组)转换为字节数组呢?

到目前为止,我找到的所有答案都有一大堆 cmets 为什么从字符串到字节数组的转换是邪恶的,它们提供了字符编码教程的链接,并包含一堆使代码膨胀的字符编码。

在我的情况下,转换应该是一个LINQ oneliner,安全而整洁。

我试过了:

sha.ComputeHash(validator.ToCharArray().ToArray<byte>())

就我的 LINQ 知识而言,我一直在玩:

sha.ComputeHash(validator.ToCharArray().ToArray<byte>(c => (byte)c))

【问题讨论】:

标签: c# linq


【解决方案1】:
validator.Select(c => (byte)c).ToArray()

也可以。 “字符串”类型支持“IEnumerable”,因此可以直接使用 LINQ。

“选择”方法允许您指定一个 lambda 来自定义您的输出。这取代了你试图用“ToArray(c => (byte)c))”做的事情。

【讨论】:

  • 缩小但在 255 以下是安全的。
  • @Alexander,根据您的输入范围,这将生成与 UTF.GetBytes 相同的哈希值
【解决方案2】:
Encoding.GetEncoding("UTF-8").GetBytes(chararray);

【讨论】:

  • 我不确定这一点,但是具有不同规范化的两个字符串可能会编码为相同的字节。这可能是可取的,也可能不是可取的。 (我认为这一点在问题指定的范围内没有实际意义。)
  • @Alexander,根据您的输入范围,这将生成与 .Select(c =&gt; (byte)c).ToArray() 相同的哈希值
  • Encoding.UTF8.GetBytes(chararray);
【解决方案3】:

出于您的目的,编码是不必要的,尽管它可能更方便。

你可以这样做,

sha.ComputeHash(validator.SelectMany(BitConverter.GetBytes).ToArray());

【讨论】:

    【解决方案4】:

    我喜欢这个版本:

     System.Text.Encoding.UTF8.GetBytes(chararray);
    

    和上面差不多

    【讨论】: