2012-02-28 100 views
3

我試圖將一個64位數字(例如,字符串"FFFFFFFFF")的十六進制表示轉換爲二進制表示("11111...")。c#十六進制位轉換

我已經試過

string result = Convert.ToString(Convert.ToUInt64(value, 16), 2); 

但這會導致一個令人困惑的編譯器錯誤:

The best overloaded method match for 'System.Convert.ToString(object, System.IFormatProvider)' has some invalid arguments

Argument 2: cannot convert from 'int' to 'System.IFormatProvider'

+0

看看http://stackoverflow.com/questions/74148/how-轉換爲十六進制和十進制數字之間的數字 – CodeZombie 2012-02-28 13:08:05

+0

@ ZombieHunter - 這會如何幫助? OP不會詢問是否轉換爲十進制,而是轉換爲表示_binary_的字符串。 – Oded 2012-02-28 13:09:17

+0

爲什麼要使用'Convert.ToInt64'不起作用? – Oded 2012-02-28 13:10:49

回答

3

有可能是一個更好的解決辦法,但檢查,如果這個工程:

public static string HexToBinary(string hexValue) 
{ 
    ulong number = UInt64.Parse(hexValue, System.Globalization.NumberStyles.HexNumber); 

    byte[] bytes = BitConverter.GetBytes(number); 

    string binaryString = string.Empty; 
    foreach (byte singleByte in bytes) 
    { 
     binaryString += Convert.ToString(singleByte, 2); 
    } 

    return binaryString; 
} 

最方便的方法是使用Convert.ToString(Int64, Int32),但ulong沒有超載。另一種解決方案是Convert.ToString(UInt64, IFormatProvider)並編寫您自己的IFormatProvider。通過查看示例,我找到了一個IFormatProvider,它用二進制,八進制和十六進制字符串表示格式化數字:http://msdn.microsoft.com/en-us/library/system.icustomformatter.aspx。 那裏的代碼看起來和我提供的非常相似,所以我認爲它不是一個糟糕的解決方案。

7

有什麼不對下面的代碼?

string hex = "FFFFFFFFFFFFFFFF"; 

// Returns -1 
long longValue = Convert.ToInt64(hex, 16); 

// Returns 1111111111111111111111111111111111111111111111111111111111111111 
string binRepresentation = Convert.ToString(longValue, 2); 

差不多你寫的(唯一的固定的ulonglong投),並返回你所期望的。

編輯: undeleted這個答案,因爲即使long表示符號,二進制表示實際上是你所期望的。

+0

FFFFFFFFFFFFFFFF給-1而不是4 ....這就是爲什麼我需要Uint64 – santBart 2012-02-28 13:07:06

+0

OP有'Convert.ToUInt64',而不是'Convert.ToInt64'(無符號,沒有簽名)。 – Oded 2012-02-28 13:07:10

+0

@ ken2k - Spot on。雖然有符號的long int寫爲-1,但它的二進制表示是正確的。 – 2012-02-28 13:34:07

0

如果使用this到十六進制字符串轉換成一個BitArray然後產生二進制表示的任務很簡單:

BitArray barray = ConvertHexToBitArray(string hexData) 
var sbuild = new StringBuilder(); 
for (int i = 0; i < barray.Length; i++) 
{ 
    sbuild.Append(barray[i] ? "1" : "0"); 
} 
Console.WriteLine(sbuild.ToString()); 
0

這裏有一個強力的辦法,沒有pancy 64位的限制:

string HexStringToBinary(string hexString) 
{ 
    var lup = 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"}};     

    var ret = string.Join("", from character in hexString 
           select lup[character]); 
    return ret; 
} 
1

最好的選擇是:

public static string hex2bin(string value) 
     { 
      return Convert.ToString(Convert.ToInt32(value, 16), 2).PadLeft(value.Length * 4, '0'); 
     }