C# 比特币sha256到十六进制生成的结果与预期不同

C# 比特币sha256到十六进制生成的结果与预期不同,c#,arrays,string,sha256,bitcoin,C#,Arrays,String,Sha256,Bitcoin,我正试图按照以下说明从以下位置获取十六进制比特币私钥的WIF: 但是,当我尝试散列字符串(包括0x80字节)时,得到的结果与预期的不同。 我应该得到8147786C4D15106333BF278D71DADAF1079EF2D2440A4DDE37D747DED5403592。 相反,我收到的是e2e4146a36e9c455cf95a4f259f162c353cd419cc3fd0e69ae36d7d1b6cd2c09 我在google上读了很多书,我明白我应该把字符串转换成二进制文件。我这样

我正试图按照以下说明从以下位置获取十六进制比特币私钥的WIF: 但是,当我尝试散列字符串(包括0x80字节)时,得到的结果与预期的不同。 我应该得到8147786C4D15106333BF278D71DADAF1079EF2D2440A4DDE37D747DED5403592。 相反,我收到的是e2e4146a36e9c455cf95a4f259f162c353cd419cc3fd0e69ae36d7d1b6cd2c09

我在google上读了很多书,我明白我应该把字符串转换成二进制文件。我这样做了,然后将这些二进制文件中的字符数组散列为相同的结果

多亏了@Heinan Cabouly和@JaredPar,代码现在可以运行了

以下是工作代码:

using System;
using System.Security.Cryptography;
using System.Text;
using System.Linq;

namespace Base58Encode
{

    internal class Program
    {
        public static string Str = "800C28FCA386C7A227600B2FE50B7CAE11EC86D3BF1FBE471BE89827E19D72AA1D";
        public static byte[] Bytes;
        public static void Main()
        {
            Bytes = StringToByteArray(Str);
            SHA256Managed sha = new SHA256Managed();
            string hashstr = String.Empty;
            byte[] encrypt = sha.ComputeHash(Bytes);
            foreach (byte b in encrypt)
            {
                hashstr += b.ToString("x2");
            }
            Console.WriteLine(hashstr);
            //prints e2e4146a36e9c455cf95a4f259f162c353cd419cc3fd0e69ae36d7d1b6cd2c09
            //instead of 8147786C4D15106333BF278D71DADAF1079EF2D2440A4DDE37D747DED5403592
            Console.ReadLine();

        }
        public static byte[] StringToByteArray(string hex)
        {
            return Enumerable.Range(0, hex.Length)
                         .Where(x => x % 2 == 0)
                         .Select(x => Convert.ToByte(hex.Substring(x, 2), 16))
                         .ToArray();

        }
    }
}
这是如何在C#中散列十六进制字符串SHA-256。
谢谢大家!帮了我很多忙

正如我前面所说,您用于转换的方法不合适。您可以使用此方法(取自@JaredPar的stackoverflow):

使用str(表示十六进制字符串)调用此函数,它将返回十六进制表示


从这里开始,您可以继续执行编写的函数。

正如我前面所说的,您用于转换的方法不适合。您可以使用此方法(取自@JaredPar的stackoverflow):

使用str(表示十六进制字符串)调用此函数,它将返回十六进制表示


从那里,您可以继续编写您的函数。

byte[]ba=Encoding.ASCII.GetBytes(Str)-您知道这不是将字符串解析为十六进制,对吗?它只是使用ASCII编码将字符串转换为字节,因此每个字符一个字节。在堆栈溢出上搜索“将十六进制字符串解析为字节c#”…谢谢,我找到了答案。:)
byte[]ba=Encoding.ASCII.GetBytes(Str)-您知道这不是将字符串解析为十六进制,对吗?它只是使用ASCII编码将字符串转换为字节,因此每个字符一个字节。在堆栈溢出上搜索“将十六进制字符串解析为字节c#”…谢谢,我找到了答案。:)非常感谢。成功了!:)非常感谢。成功了!:)
public static byte[] StringToByteArray(string hex) {
    return Enumerable.Range(0, hex.Length)
                 .Where(x => x % 2 == 0)
                 .Select(x => Convert.ToByte(hex.Substring(x, 2), 16))
                 .ToArray();
}