C# 是否有相当于 Python 的 unhexlify 的方法?

发布于 2024-08-05 14:54:32 字数 863 浏览 4 评论 0原文

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

我是在 C# 中搜索 python 兼容方法将十六进制转换为二进制。我通过这样做反转了 Python 中的哈希:

import sha
import base64
import binascii

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

到目前为止,我发现的所有各种 Hex2Binary C# 方法最终都会抛出 OverflowExceptions:

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 输出吗?

Possible Duplicate:
How to convert hex to a byte array?

I'm searching for a python compatible method in C# to convert hex to binary. I've reversed a hash in Python by doing this:

import sha
import base64
import binascii

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

So far all of the various Hex2Binary C# methods I've found end up throwing OverflowExceptions:

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);
}

Anybody got a tip on how to produce a C# method to match the python output?

如果你对这篇内容有疑问,欢迎到本站社区发帖提问 参与讨论,获取更多帮助,或者扫码二维码加入 Web 技术交流群。

扫码二维码加入Web技术交流群

发布评论

需要 登录 才能够评论, 你可以免费 注册 一个本站的账号。

评论(2

笑忘罢 2024-08-12 14:54:32

该值对于 long(64 位)来说太大,这就是您收到 OverflowException 的原因。

但是将十六进制逐字节转换为二进制非常容易(实际上是半字节半字节):

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);
}

This value is too big for a long (64bits), that's why you get an OverflowException.

But it's very easy to convert hex to binary byte by byte (well, nibble by nibble actually) :

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();
}

EDIT: the method above converts to binary, not to base64. This one converts to 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);
}
刘备忘录 2024-08-12 14:54:32

您可以将十六进制字符串分为两位数组,然后使用 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();
}

You can divide your hexadecimal string into two-digit groups, and then use byte.parse to convert them to bytes. Use the NumberStyles.AllowHexSpecifier for that, for example:

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

The following routine will convert a hex string to a byte array:

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();
}
~没有更多了~
我们使用 Cookies 和其他技术来定制您的体验包括您的登录状态等。通过阅读我们的 隐私政策 了解更多相关信息。 单击 接受 或继续使用网站,即表示您同意使用 Cookies 和您的相关数据。
原文