繁体   English   中英

C# 十六进制到字符串的转换与 PHP 十六进制到字符串不匹配

[英]C# conversion Hex to String does not match PHP Hex to String

我正在将用 PHP 编写的加密库转换为 C#,但遇到了一个小问题。 当在 PHP 中将 HEX 字符串转换为字符串时,我得到一个不同的值,然后我的 C# 代码应该做完全相同的事情。

这是我使用的php代码:

public function hex2str($hex)
{
    $str = '';
    for($i=0; $i<strlen($hex); $i+=2)
    {
        $str.=chr(hexdec(substr($hex, $i, 2)));
    }
    return $str;
}

还有我的 C# 代码:

public static string Hex2Str(string hexString)
{
    char[] mychar = new char[hexString.Length / 2];
    for (var i = 0; i < mychar.Length; i++)
    {
        // Convert the number expressed in base-16 to an integer. 
        int value = Convert.ToInt32(hexString.Substring(i * 2, 2), 16);
        string stringValue = Char.ConvertFromUtf32(value);
        mychar[i] = (char)value;
    }

    return new String(mychar);
}

我使用的十六进制值是:

E0D644FCDEB4CCA04D51F617D59084D8

这是 PHP 脚本和我的 C# 脚本返回值之间差异的图片:

在此处输入图片说明

如果有人能帮我发现我在 C# 代码中的错误,我将非常感谢您的帮助!

区别在于使用的代码页不同。 PHP 似乎使用了 OEM 字符集(代码页 850),它仍然与默认命令行一起使用。

你可以试试这个:

public static string Hex2Str(string hexString)
{
    byte[] myBytes = new byte[hexString.Length / 2];
    for (var i = 0; i < myBytes.Length; i++)
    {
        // Convert the number expressed in base-16 to an integer. 
        int value = Convert.ToInt32(hexString.Substring(i * 2, 2), 16);

        myBytes[i] = (byte)value;

    }
    return Encoding.GetEncoding(850).GetString(myBytes);
}

请注意,您机器上实际使用的编码取决于本地设置。

您还可以更改代码页或使用标准编码之一:

return Encoding.Default.GetString(myBytes);

这个可能会给你第一次尝试的初步结果。

另请注意,大概使用 php 写入文件会给您带来另一个结果,而不是在命令行中打印到 stdio。

我认为您的 c# 算法Hex2Str看起来不错,但我可能会建议进行以下小改动以避免与代理对编码的任何可能的不一致:

    public static string Hex2Str(string hexString)
    {
        var sb = new StringBuilder();

        var len = hexString.Length / 2;
        for (var i = 0; i < len; i++)
        {
            // Convert the number expressed in base-16 to an integer. 
            int value = Convert.ToInt32(hexString.Substring(i * 2, 2), 16);
            string stringValue = Char.ConvertFromUtf32(value);
            sb.Append(stringValue);
        }

        return sb.ToString();
    }

我怀疑这里真正的问题是来自 PHP 的字符串在通过控制台时由于编码不一致而被破坏。 例如,如果 PHP 控制台具有Latin 9 (ISO)编码并且您的输入控制台具有OEM United States编码(它在我的计算机上),那么“à”将被转换为“α”。

相反,我建议在将 PHP 字符串写入控制台之前,使用base64_encode在 Base64 中编码您的 PHP 字符串。 这将保证通过控制台传递的纯 ASCII 表示。 然后解码如下:

    public static string FromPHPBase64String(string phpString)
    {
        var bytes = Convert.FromBase64String(phpString);
        var sb = new StringBuilder();
        foreach (var b in bytes)
        {
            string stringValue = char.ConvertFromUtf32(b);
            sb.Append(stringValue);
        }
        return sb.ToString();
    }

我相信现在一切都应该匹配。

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM