2011-04-10 237 views
12

我正在寻找将二进制长字符串转换为十六进制字符串的方法。将二进制长字符串转换为十六进制c#

二进制串看起来是这样的"0110011010010111001001110101011100110100001101101000011001010110001101101011"

我使用

hex = String.Format("{0:X2}", Convert.ToUInt64(hex, 2)); 

尝试,但只有当二进制串融入一个答:64该字符串是否足够长,它赢得了”工作吨。

是否有另一种方法将二进制字符串转换为十六进制?

谢谢

+8

为什么w你是否期望'Convert.ToUInt64()'能够处理一个表示大于'UInt64'的值的字符串? – 2011-04-10 14:14:57

回答

24

我只是把它敲了出来。也许你可以作为一个起点使用...

public static string BinaryStringToHexString(string binary) 
{ 
    StringBuilder result = new StringBuilder(binary.Length/8 + 1); 

    // TODO: check all 1's or 0's... Will throw otherwise 

    int mod4Len = binary.Length % 8; 
    if (mod4Len != 0) 
    { 
     // pad to length multiple of 8 
     binary = binary.PadLeft(((binary.Length/8) + 1) * 8, '0'); 
    } 

    for (int i = 0; i < binary.Length; i += 8) 
    { 
     string eightBits = binary.Substring(i, 8); 
     result.AppendFormat("{0:X2}", Convert.ToByte(eightBits, 2)); 
    } 

    return result.ToString(); 
} 
+0

非常有用,谢谢@米奇小麦。 – 2011-12-16 08:32:20

-1

您可以一次输入四位数的数字。将这个数字转换为ex(就像你没有问题),然后将字符串连接在一起。因此,您可以从大小中获取一个代表十六进制数字的字符串。根据你的输入字符串开始MSB的位置,可能是你获得的输出字符串,我描述的方式必须是反转

0

考虑四位可以由一个十六进制值来表示,可以通过简单的四组去和他们seperately转换,价值不会改变方式。

string bin = "11110110"; 

int rest = bin.Length % 4; 
bin = bin.PadLeft(rest, '0'); //pad the length out to by divideable by 4 

string output = ""; 

for(int i = 0; i <= bin.Length - 4; i +=4) 
{ 
    output += string.Format("{0:X}", Convert.ToByte(bin.Substring(i, 4), 2)); 
} 
1

考虑到四位可以用一个十六进制值表示,您可以简单地按四个组进行转换并将它们单独转换,值不会以这种方式改变。

string bin = "11110110"; 

int rest = bin.Length % 4; 
if(rest != 0) 
    bin = new string('0', 4-rest) + bin; //pad the length out to by divideable by 4 

string output = ""; 

for(int i = 0; i <= bin.Length - 4; i +=4) 
{ 
    output += string.Format("{0:X}", Convert.ToByte(bin.Substring(i, 4), 2)); 
} 
0
static string BinToHex(string bin) 
{ 
    if (bin == null) 
     throw new ArgumentNullException("bin"); 
    if (bin.Length % 8 != 0) 
     throw new ArgumentException("The length must be a multiple of 8", "bin"); 

    var hex = Enumerable.Range(0, bin.Length/8) 
        .Select(i => bin.Substring(8 * i, 8)) 
        .Select(s => Convert.ToByte(s, 2)) 
        .Select(b => b.ToString("x2")); 
    return String.Join(null, hex); 
} 
11

这可以帮助你:

string HexConverted(string strBinary) 
    { 
     string strHex = Convert.ToInt32(strBinary,2).ToString("X"); 
     return strHex; 
    } 
+1

不错的兄弟比它为我工作..:D – rummykhan 2014-04-19 20:34:23

+4

该问题涉及超过64位的字符串。 – 2014-09-18 17:52:33

4
Convert.ToInt32("1011", 2).ToString("X"); 
+0

你能解释什么是'2',第二个参数 – Fazal 2016-04-30 06:48:56

+1

'2'告诉'Convert.ToInt32'方法,提供的字符串是基数2.考虑将十六进制字符串“AABBCC”转换为“int”(这是'11189196'):简单地指定你的字符串是以16为底的,就像这样:'Convert.ToInt32(“AABBCC”,16)' – 2016-07-01 03:01:41

2

我想出了这个方法。我是新来的编程和C#,但我希望你会欣赏它:

static string BinToHex(string bin) 
{ 
    StringBuilder binary = new StringBuilder(bin); 
    bool isNegative = false; 
    if (binary[0] == '-') 
    { 
     isNegative = true; 
     binary.Remove(0, 1); 
    } 

    for (int i = 0, length = binary.Length; i < (4 - length % 4) % 4; i++) //padding leading zeros 
    { 
     binary.Insert(0, '0'); 
    } 

    StringBuilder hexadecimal = new StringBuilder(); 
    StringBuilder word = new StringBuilder("0000"); 
    for (int i = 0; i < binary.Length; i += 4) 
    { 
     for (int j = i; j < i + 4; j++) 
     { 
      word[j % 4] = binary[j]; 
     } 

     switch (word.ToString()) 
     { 
      case "0000": hexadecimal.Append('0'); break; 
      case "0001": hexadecimal.Append('1'); break; 
      case "0010": hexadecimal.Append('2'); break; 
      case "0011": hexadecimal.Append('3'); break; 
      case "0100": hexadecimal.Append('4'); break; 
      case "0101": hexadecimal.Append('5'); break; 
      case "0110": hexadecimal.Append('6'); break; 
      case "0111": hexadecimal.Append('7'); break; 
      case "1000": hexadecimal.Append('8'); break; 
      case "1001": hexadecimal.Append('9'); break; 
      case "1010": hexadecimal.Append('A'); break; 
      case "1011": hexadecimal.Append('B'); break; 
      case "1100": hexadecimal.Append('C'); break; 
      case "1101": hexadecimal.Append('D'); break; 
      case "1110": hexadecimal.Append('E'); break; 
      case "1111": hexadecimal.Append('F'); break; 
      default: 
       return "Invalid number"; 
     } 
    } 

    if (isNegative) 
    { 
     hexadecimal.Insert(0, '-'); 
    } 

    return hexadecimal.ToString(); 
} 
0

如果你想遍历每个字节的十六进制表示的字符串中,你可以使用以下扩展名。我把米奇的答案与this结合起来。

static class StringExtensions 
{ 
    public static IEnumerable<string> ToHex(this String s) { 
     if (s == null) 
      throw new ArgumentNullException("s"); 

     int mod4Len = s.Length % 8; 
     if (mod4Len != 0) 
     { 
      // pad to length multiple of 8 
      s = s.PadLeft(((s.Length/8) + 1) * 8, '0'); 
     } 

     int numBitsInByte = 8; 
     for (var i = 0; i < s.Length; i += numBitsInByte) 
     { 
      string eightBits = s.Substring(i, numBitsInByte); 
      yield return string.Format("{0:X2}", Convert.ToByte(eightBits, 2)); 
     } 
    } 
} 

例子:

string test = "0110011010010111001001110101011100110100001101101000011001010110001101101011"; 

foreach (var hexVal in test.ToHex()) 
{ 
    Console.WriteLine(hexVal); 
} 

打印

06 
69 
72 
75 
73 
43 
68 
65 
63 
6B 
1

如果你使用.NET 4.0或更高版本,如果你愿意使用System.Numerics.dll(为的BigInteger类),下面的解决方案工作正常:

public static string ConvertBigBinaryToHex(string bigBinary) 
{ 
    BigInteger bigInt = BigInteger.Zero; 
    int exponent = 0; 

    for (int i = bigBinary.Length - 1; i >= 0; i--, exponent++) 
    { 
     if (bigBinary[i] == '1') 
      bigInt += BigInteger.Pow(2, exponent); 
    } 

    return bigInt.ToString("X"); 
} 
相关问题