将长十六进制字符串转换为二进制字符串抛出 OverflowException

Converting long hex string to binary string throws OverflowException

试图将一个巨大的十六进制字符串转换为二进制字符串,但不断抛出 OverflowException。这是我将图像文件转换为十六进制字符串的代码(与 FlowDocument 一起使用时效果很好!):

string h = new System.Runtime.Remoting.Metadata.W3cXsd2001.SoapHexBinary(System.IO.File.ReadAllBytes(Path)).ToString();

但是,现在我想将这个十六进制字符串转换为二进制字符串,以便它也可以显示在 FlowDocument 中。首先,我尝试将其写入临时文本文件,然后尝试将其读入字节数组:

string TempPath = System.IO.Path.Combine(System.IO.Path.GetTempPath(), "Text.txt");
using (System.IO.StreamWriter sw = new System.IO.StreamWriter(TempPath))
{
    sw.WriteLine(Convert.ToString(Convert.ToInt64(h, 16), 2).PadLeft(12, '0'));
}
byte[] c = System.IO.File.ReadAllBytes(TempPath);

当这不起作用时,我尝试将其读入字符串:

string c = System.IO.File.ReadAll(TempPath);

都没有用,仍然抛出 OverflowException。我也试过这样做并完全跳过写入文件:

string s = Convert.ToString(Convert.ToInt64(h, 16), 2).PadLeft(12, '0')

不管我采用什么方法,我仍然会抛出异常。像这样的大字符串通常是如何处理的?

更新

我修改了我的算法,一次转换一个字符,所以现在它看起来像这样:

string NewBinary = "";
try
{
    int i = 0;
    foreach (char c in h)
    {
        if (i == 100) break;
        NewBinary = string.Concat(NewBinary, Convert.ToString(Convert.ToInt64(c.ToString(), 16), 2).PadLeft(12, '0'));
        i++;
    }
}

问题是字符串总是超长,上面的代码需要很长时间才能生成二进制字符串。我将长度限制为 100 以测试转换,因此转换本身不是问题。

int64 由 16 个字符的十六进制字符串表示,这就是为什么尝试转换 "huge string" 会导致 OverflowException - 该值超过了 int64 可以表示的值。您需要将字符串分成最多 16 个字符的组并将它们转换为二进制并将它们连接起来。

将字符串的每个十六进制字符转换为相应的二进制模式(例如 A 变为 1010 等)

您可以使用查找数组一次转换一个半字节,例如:

public static string HexStringToBinaryString(string hexString)
{
    var result = new StringBuilder();

    string[] lookup =
    {
        "0000", "0001", "0010", "0011",
        "0100", "0101", "0110", "0111",
        "1000", "1001", "1010", "1011",
        "1100", "1101", "1110", "1111"
    };

    foreach (char nibble in hexString.Select(char.ToUpper))
        result.Append((nibble > '9') ? lookup[10+nibble-'A'] : lookup[nibble-'0']);

    return result.ToString();
}