【问题标题】:C# how convert large HEX string to binaryC#如何将大的十六进制字符串转换为二进制
【发布时间】:2011-09-30 19:55:56
【问题描述】:

我有一个 14 个字符的字符串。这是 7 个字节的十六进制表示。我想将其转换为二进制。我尝试使用Convert.ToString(Convert.ToInt32(hexstring, 16), 2); 对于小字符串,这有效,但对于 14 个字符,它不起作用,因为结果太大。 我该如何管理?请记住,转换的输出应该是长度为 56 个字符的二进制字符串(我们必须保留前导零)。 (例如(字节)0x01 的转换应该产生“00000001”而不是“1”)

【问题讨论】:

  • 使用更大的整数 ToInt64 ?
  • 字符串 lexi=("FF");字符串 r = null; foreach (char c in lex) { r = r + Convert.ToString(Convert.ToInt32(c, 16), 2); } Console.Write(r);我试过了,但显然有问题
  • 其实我做到了! foreach (char c in lex) { string voithitiko = null; voithitiko = Convert.ToString(Convert.ToInt32(c.ToString(), 16), 2);而 (voithitiko.Length!=4 ) { voithitiko="0"+voithitiko; olotoMEbinary = olotoMEbinary + voithitiko; }

标签: c# string hex bin


【解决方案1】:

您可以将每个十六进制数字转换为四个二进制数字:

string binarystring = String.Join(String.Empty,
  hexstring.Select(
    c => Convert.ToString(Convert.ToInt32(c.ToString(), 16), 2).PadLeft(4, '0')
  )
);

您需要在文件顶部添加一个using System.Linq; 才能使用此功能。

【讨论】:

  • 参数 2:无法从 'System.Collections.Generic.IEnumerable' 转换为 'string[]'
  • @JohnChris:那么您使用的框架版本没有String.Join(string, IEnumerable<string>) 重载。您可以将.ToArray() 添加到.Select(...) 以解决该问题。
【解决方案2】:

为什么不采用简单的方法并定义自己的映射?

private static readonly Dictionary<char, string> hexCharacterToBinary = new Dictionary<char, string> {
    { '0', "0000" },
    { '1', "0001" },
    { '2', "0010" },
    { '3', "0011" },
    { '4', "0100" },
    { '5', "0101" },
    { '6', "0110" },
    { '7', "0111" },
    { '8', "1000" },
    { '9', "1001" },
    { 'a', "1010" },
    { 'b', "1011" },
    { 'c', "1100" },
    { 'd', "1101" },
    { 'e', "1110" },
    { 'f', "1111" }
};

public string HexStringToBinary(string hex) {
    StringBuilder result = new StringBuilder();
    foreach (char c in hex) {
        // This will crash for non-hex characters. You might want to handle that differently.
        result.Append(hexCharacterToBinary[char.ToLower(c)]);
    }
    return result.ToString();
}

请注意,这将保留前导零。所以"aa" 将被转换为"10101010""00000aa" 将被转换为"0000000000000000000010101010"

【讨论】:

    【解决方案3】:
    Convert.ToString(Convert.ToInt<b>64</b>(hexstring, 16), 2);

    也许?或者

    Convert.ToString(Convert.ToInt64(hexstring, 16), 2)<b>.PadLeft(56, '0')</b>;

    【讨论】:

    • @jayt:你能说为什么不吗?一个 64 位整数,顾名思义,有 8 个字节(或 7 和 7/8)的空间,而你只需要 7...
    • @jayt:如果是因为前导零问题,我想你知道PadLeft,如果你已经将它用于适合 32 位的那些?无论如何,编辑答案。
    【解决方案4】:

    我的 C++ 背景答案:

    private Byte[] HexToBin(string pHexString)
    {
        if (String.IsNullOrEmpty(pHexString))
            return new Byte[0];
    
        if (pHexString.Length % 2 != 0)
            throw new Exception("Hexstring must have an even length");
    
        Byte[] bin = new Byte[pHexString.Length / 2];
        int o = 0;
        int i = 0;
        for (; i < pHexString.Length; i += 2, o++)
        {
            switch (pHexString[i])
            {
                case '0': bin[o] = 0x00; break;
                case '1': bin[o] = 0x10; break;
                case '2': bin[o] = 0x20; break;
                case '3': bin[o] = 0x30; break;
                case '4': bin[o] = 0x40; break;
                case '5': bin[o] = 0x50; break;
                case '6': bin[o] = 0x60; break;
                case '7': bin[o] = 0x70; break;
                case '8': bin[o] = 0x80; break;
                case '9': bin[o] = 0x90; break;
                case 'A':
                case 'a': bin[o] = 0xa0; break;
                case 'B':
                case 'b': bin[o] = 0xb0; break;
                case 'C':
                case 'c': bin[o] = 0xc0; break;
                case 'D':
                case 'd': bin[o] = 0xd0; break;
                case 'E':
                case 'e': bin[o] = 0xe0; break;
                case 'F':
                case 'f': bin[o] = 0xf0; break;
                default: throw new Exception("Invalid character found during hex decode");
            }
    
            switch (pHexString[i+1])
            {
                case '0': bin[o] |= 0x00; break;
                case '1': bin[o] |= 0x01; break;
                case '2': bin[o] |= 0x02; break;
                case '3': bin[o] |= 0x03; break;
                case '4': bin[o] |= 0x04; break;
                case '5': bin[o] |= 0x05; break;
                case '6': bin[o] |= 0x06; break;
                case '7': bin[o] |= 0x07; break;
                case '8': bin[o] |= 0x08; break;
                case '9': bin[o] |= 0x09; break;
                case 'A':
                case 'a': bin[o] |= 0x0a; break;
                case 'B':
                case 'b': bin[o] |= 0x0b; break;
                case 'C':
                case 'c': bin[o] |= 0x0c; break;
                case 'D':
                case 'd': bin[o] |= 0x0d; break;
                case 'E':
                case 'e': bin[o] |= 0x0e; break;
                case 'F':
                case 'f': bin[o] |= 0x0f; break;
                default: throw new Exception("Invalid character found during hex decode");
            }
        }
        return bin;
    }
    

    【讨论】:

      【解决方案5】:

      您可以使用此代码从十六进制字符串中获取字节数组

       public static byte[] StringToByteArray(String hex)
          {
              int NumberChars = hex.Length;
              byte[] bytes = new byte[NumberChars / 2];
              for (int i = 0; i < NumberChars; i += 2)
                  bytes[i / 2] = Convert.ToByte(hex.Substring(i, 2), 16);
              return bytes;
          }
      

      【讨论】:

        【解决方案6】:

        如果一次转换一个字符会怎样?我无法对此进行测试,但这个想法应该可行。

        //Convert.ToString(Convert.ToInt32(hexstring, 16), 2)
        
        StringBuilder sb = new StringBuilder();
        foreach( char c in hexstring.ToCharArray() ){
          sb.Append( Convert.ToString(Convert.ToInt32(c.ToString(), 16), 2);
        }
        

        【讨论】:

          【解决方案7】:

          你可以这样做。

          我已经把它放在一个名为 UtilMath 的类中 这是一个好主意,因为如果您曾经在不同的程序中使用它,您可以再次使用该类。 顾名思义,这适用于我所有的数学函数。

          using System;
          using System.Collections.Generic;
          using System.Linq;
          using System.Text;
          
          namespace Math.Util
          {
              class UtilMath
              {
          
                  public static string hex2binary(string hexvalue)
                  {
                      // Convert.ToUInt32 this is an unsigned int
                      // so no negative numbers but it gives you one more bit
                      // it much of a muchness 
                      // Uint MAX is 4,294,967,295 and MIN is 0
                      // this padds to 4 bits so 0x5 = "0101"
                      return String.Join(String.Empty, hexvalue.Select(c => Convert.ToString(Convert.ToUInt32(c.ToString(), 16), 2).PadLeft(4, '0')));
                  }
              }
          }
          

          现在在你使用它之前你需要包含它,

          using Math.Util
          

          那么如果你需要使用它,你可以通过去调用它

          UtilMath.hex2binary("FF");
          

          或者

          String hexString = "FF";
          UtilMath.hex2binary(hexString);
          

          希望这会有所帮助。

          【讨论】:

            【解决方案8】:

            Convert.FromHexString 已在 .Net 5 中引入

             var bytes = Convert.FromHexString("13AF3F")
            

            【讨论】:

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