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