簡體   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