Md5返回原始字节而不是十六进制

时间:2014-06-26 12:31:07

标签: c# php md5

我有一些PHP代码,我想在c#中创建它。

我的PHP代码:

$md5raw = md5($str2hash, true);

我在c#中的代码:

        static string GetMd5Hash(MD5 md5Hash, string input)
    {

        byte[] data = md5Hash.ComputeHash(Encoding.UTF8.GetBytes(input));

        // Create a new Stringbuilder to collect the bytes 
        // and create a string.
        StringBuilder sBuilder = new StringBuilder();

        // Loop through each byte of the hashed data  
        // and format each one as a hexadecimal string. 
        for (int i = 0; i < data.Length; i++)
        {
            sBuilder.Append(data[i].ToString("x2"));
        }

        // Return the hexadecimal string. 
        return sBuilder.ToString();
    }

这两个代码的结果不一样

PHP:赏} + X6
C#:0f9de8b39ee7187d92bb2b5817bb36ee

我应该在c#代码中更改哪些内容?

1 个答案:

答案 0 :(得分:0)

如果您只想要字节数组,请跳过转换:

static byte[] GetMd5Hash(MD5 md5Hash, string input)
{
    return md5Hash.ComputeHash(Encoding.UTF8.GetBytes(input));
}

<强>更新

你肯定应该改变你的PHP函数来返回编码数据并在.net(C#)中使用相同的编码。

你想要的是获取一个包含二进制数据的字符串,但是由于在传输过程中重新编码二进制数据,你将丢失信息。

static string GetMd5Hash(MD5 md5Hash, string input)
{
    // BUG: This code probably will lose information
    return Encoding.ASCII.GetString(md5Hash.ComputeHash(Encoding.UTF8.GetBytes(input)));
}

您应该如何使用您的问题中的C#函数并将其用作PHP函数:

$md5raw = bin2hex(md5($str2hash, true));