2016-05-11 2 views
1

У меня есть BitArray с разным размером, и я хочу получить преобразование в шестнадцатеричной строке.
Я попытался преобразовать BitArray в byte[], но он не дал мне правильный формат. (Converting a boolean array into a hexadecimal number)C# - BitArray to Hex

Для Exemple, BitArray 12, и я хочу, чтобы строка быть A8C (3 гекса, потому что 12 бит)
Благодарности

+0

Http: // StackOverflow. com/a/4619295/4928207 –

+1

А что, если 'BitArray' имеет размер' 13'? –

+0

Coudn't вы просто обрезаете строку результата до длины 'Math.Ceil (BitArray.Length/4.0)'? –

ответ

1

Вы можете попробовать прямой

StringBuilder sb = new StringBuilder(bits.Length/4); 

    for (int i = 0; i < bits.Length; i += 4) { 
    int v = (bits[i] ? 8 : 0) | 
      (bits[i + 1] ? 4 : 0) | 
      (bits[i + 2] ? 2 : 0) | 
      (bits[i + 3] ? 1 : 0); 

    sb.Append(v.ToString("x1")); // Or "X1" 
    } 

    String result = sb.ToString(); 
+0

Это прекрасно работает! Большое спасибо –

+0

@D. МИРАХИ: добро пожаловать! –

0

Solution обеспечивают в Converting a boolean array into a hexadecimal number правильно.

 BitArray arr = new BitArray(new int[] { 12 }); 
     byte[] data1 = new byte[100]; 
     arr.CopyTo(data1, 0); 
     string hex = BitConverter.ToString(data1); 
+1

Это решение работает для BitArray, которое кратно 8. Но для 12 он не работает –

0

Я реализовал три полезных методы расширения для BitArray, который способен делать то, что вы хотите:

public static byte[] ConvertToByteArray(this BitArray bitArray) 
    { 
     byte[] bytes = new byte[(int)Math.Ceiling(bitArray.Count/8.0)]; 
     bitArray.CopyTo(bytes, 0); 
     return bytes; 
    } 

    public static int ConvertToInt32(this BitArray bitArray) 
    { 
     var bytes = bitArray.ConvertToByteArray(); 

     int result = 0; 

     foreach (var item in bytes) 
     { 
      result += item; 
     } 

     return result; 
    } 

    public static string ConvertToHexadecimal(this BitArray bitArray) 
    { 
     return bitArray.ConvertToInt32().ToString("X"); 
    }