【问题标题】:Converting long hex string to binary string throws OverflowException将长十六进制字符串转换为二进制字符串会引发溢出异常
【发布时间】:2016-01-25 19:38:54
【问题描述】:

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

【问题讨论】:

    标签: c# wpf string binary hex


    【解决方案1】:

    int64 由 16 个字符的十六进制字符串表示,这就是尝试转换“巨大字符串”会导致 OverflowException 的原因 - 该值超过了 int64 可以表示的值。您需要将字符串分成最多 16 个字符的组并将它们转换为二进制并连接它们。

    【讨论】:

      【解决方案2】:

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

      【讨论】:

      • 我已经在我的原始帖子中添加了执行此操作的代码,但这会占用大量时间,并且考虑到字符串可能非常非常长,这可能并不理想。有更好的方法吗?
      【解决方案3】:

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

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

      【讨论】:

        猜你喜欢
        • 1970-01-01
        • 2019-08-23
        • 1970-01-01
        • 2020-01-04
        • 2016-06-02
        • 2017-02-23
        • 2014-08-03
        相关资源
        最近更新 更多