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

时间:2015-10-26 16:00:49

标签: c# wpf string binary hex

尝试将巨大的十六进制字符串转换为二进制字符串,但会抛出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以测试转换,因此转换本身不是问题。

3 个答案:

答案 0 :(得分:1)

int64由16个字符的十六进制字符串表示,这就是为什么尝试转换“巨大字符串”会导致OverflowException - 该值大于int64可以表示的值。你需要将字符串分成最多16个字符组和一组。将它们转换为二进制&连接它们。

答案 1 :(得分:1)

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

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

答案 2 :(得分:0)

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