C#中是否有Python的unhexlify等效功能?

4 投票
2 回答
4539 浏览
提问于 2025-04-15 14:30

可能重复的问题:
如何将十六进制转换为字节数组?

我在找一种在C#中可以用来将十六进制转换为二进制的方法,这个方法要和Python兼容。我在Python中通过以下方式反转了一个哈希:

import sha
import base64
import binascii

hexvalue = "5baa61e4c9b93f3f0682250b6cf8331b7ee68fd8"
binaryval = binascii.unhexlify(hexvalue)
print base64.standard_b64encode(binaryval)
>> W6ph5Mm5Pz8GgiULbPgzG37mj9g=

到目前为止,我找到的各种Hex2Binary的C#方法都出现了溢出异常:

static string Hex2Binary(string hexvalue)
{
    string binaryval = "";
    long b = Convert.ToInt64(hexvalue, 16);
    binaryval = Convert.ToString(b);
    byte[] bytes = Encoding.UTF8.GetBytes(binaryval);
    return Convert.ToBase64String(bytes);
}

有没有人能给个建议,如何写一个C#的方法,让它的输出和Python的一样?

2 个回答

1

你可以把你的十六进制字符串分成两位一组,然后用 byte.parse 来把它们转换成字节。为此,可以使用 NumberStyles.AllowHexSpecifier,举个例子:

byte.Parse("3F", NumberStyles.AllowHexSpecifier);

下面这个程序会把一个十六进制字符串转换成一个字节数组:

private byte[] Hex2Binary(string hex)
{
    var chars = hex.ToCharArray();
    var bytes = new List<byte>();
    for(int index = 0; index < chars.Length; index += 2) {
        var chunk = new string(chars, index, 2);
        bytes.Add(byte.Parse(chunk, NumberStyles.AllowHexSpecifier));
    }
    return bytes.ToArray();
}
6

这个值太大了,超出了长整型(64位)的范围,所以你会遇到一个溢出异常。

不过,把十六进制转换成二进制其实很简单,可以一个字节一个字节地转换(实际上是一个半字节一个半字节地转换):

static string Hex2Binary(string hexvalue)
{
    StringBuilder binaryval = new StringBuilder();
    for(int i=0; i < hexvalue.Length; i++)
    {
        string byteString = hexvalue.Substring(i, 1);
        byte b = Convert.ToByte(byteString, 16);
        binaryval.Append(Convert.ToString(b, 2).PadLeft(4, '0'));
    }
    return binaryval.ToString();
}

补充一下:上面的方法是把值转换成二进制,而不是转换成Base64。下面这个方法是用来转换成Base64的:

static string Hex2Base64(string hexvalue)
{
    if (hexvalue.Length % 2 != 0)
        hexvalue = "0" + hexvalue;
    int len = hexvalue.Length / 2;
    byte[] bytes = new byte[len];
    for(int i = 0; i < len; i++)
    {
        string byteString = hexvalue.Substring(2 * i, 2);
        bytes[i] = Convert.ToByte(byteString, 16);
    }
    return Convert.ToBase64String(bytes);
}

撰写回答