2011-04-10 277 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"); 
} 
相關問題