在Ruby应用程序中,如何匹配C#中Unicode字符串的MD5哈希的输出?

在Ruby应用程序中,如何匹配C#中Unicode字符串的MD5哈希的输出?,c#,ruby,unicode,C#,Ruby,Unicode,下面是c#的代码片段 输出: bytes = [116, 0, 101, 0, 115, 0, 116, 0] numArray = [200, 5, 158, 46, 199, 65, 159, 89, 14, 121, 215, 241, 183, 116, 191, 230] bytes = ["116", "0", "101", "0", "115", "0", "116", "0"] 以上是使用Ruby或RubyonRails实现的相同目标,但面临一些问题- ruby代码 by

下面是c#的代码片段

输出:

bytes = [116, 0, 101, 0, 115, 0, 116, 0] 
numArray = [200, 5, 158, 46, 199, 65, 159, 89, 14, 121, 215, 241, 183, 116, 191, 230] 
bytes = ["116", "0", "101", "0", "115", "0", "116", "0"]
以上是使用Ruby或RubyonRails实现的相同目标,但面临一些问题-

ruby代码

bytes = "test".bytes.to_a.join(",") + ","
bytes = bytes.gsub(",", "/0/").split("/")
numArray = Digest::MD5.digest(bytes)
输出:

bytes = [116, 0, 101, 0, 115, 0, 116, 0] 
numArray = [200, 5, 158, 46, 199, 65, 159, 89, 14, 121, 215, 241, 183, 116, 191, 230] 
bytes = ["116", "0", "101", "0", "115", "0", "116", "0"]

当我试图访问Digest::MD5.Digest时,它只接受字符串值,如果我将其转换为字符串,则无法获得与提供的C#代码相同的结果

这适用于Ruby 1.9.3及更高版本:

require 'digest/md5'
Digest::MD5.digest( "test".encode( 'UTF-16LE' ) ).bytes.to_a
 => [200, 5, 158, 46, 199, 65, 159, 89, 14, 121, 215, 241, 183, 116, 191, 230]
一些解释:

  • 对于Unicode字符串,C#(以及一般的Microsoft代码)默认为UTF-16LE
  • 插入逗号和
    gsub
    会给字符串带来麻烦,请使用Ruby的字符串编码方法
  • Digest::MD5.Digest
    将读取输入字符串,就像强制编码为“ASCII-8BIT”(即,它只读取字符串中存储的字节,而忽略字符语义),还将返回该编码中的数据
字节
每个字节的简写形式。因此它已经是一个数组了@j03w:有趣。这是1.9.3(返回一个枚举数)的一个变化-我的代码在这两种情况下都可以工作,但是
.to_a
在2.0.0中是多余的。非常感谢Neil,这正是我想要的。非常感谢。你能澄清一下“用C#查找现成代码”吗?您是否需要匹配C#示例的输出?我在回答中假设情况就是这样。