2016-06-27 5 views
3

Я им пытаюсь преобразовать BitArray в Hex СтрунногоBitArray (16) в шестнадцатеричную

Моего тест BitArray является "0000001010000000", и он должен вернуться "02 80" в шестнадцатеричном

судимого следующего:

 BitArray b = new BitArray(16); 
     b.Set(7, true); 
     b.Set(9, true); 

Затем, исследуя объект BitArray, который я создал, и получим десятичное значение 640, соответствующее этой двоичной строке.

Но я не могу найти способ конвертировать это в шестнадцатеричный.

Я избегаю работать с байт-массивом, который отличается от класса.

Это работает, но его вид сложного им, что там должно быть easuier путь, и я не могу понять, почему я должен переключить значения

 byte[] bytes = new byte[2]; 
     b.CopyTo(bytes, 0); 
     string Retorno = BitConverter.ToString(bytes); 
     string[] auxstr = Retorno.Split('-'); 
     Retorno = auxstr[1] + "-" + auxstr[0]; 

Любые советы?

+1

Посмотрите на [это] (http://stackoverflow.com/a/5533572/2030635) SO отправлять –

+2

Возможные дублировать [Как преобразовать байт-массив в шестнадцатеричную строку и наоборот?] (http://stackoverflow.com/questions/311165/how-do-you-convert-byte-array-to-hexadecimal-string-and -vice-versa) –

+0

Вы можете преобразовать его в 'byte []' как в [этот вопрос] (http://stackoverflow.com/questions/560123/convert-from-bitarray-to-byte) и отформатировать байты отдельно , – Codor

ответ

1

Затем, рассматривая объект BitArray я создал и сделать получить 640 десятичное значение, которое соответствует этой бинарной строки.

Итак, вы хотите создать строковое представление шестнадцатеричного значения? Это можно легко сделать так:

int dec = 640; 
string s = Convert.ToString(dec, 16); 

или даже string s = $"{dec:X}";

Для ведущих нулей (как вы показываете в вашем вопросе) оптимальным будет

string s = $"{dec:X4}"; 

Обратите внимание, что 640 в шестнадцатеричное 280 нет 208 как указано по вашему вопросу.


простой способ получить "ценность" вашего BitArray является (по длине < = 32):

int v = array.OfType<bool>().Select((b, i) => b ? 1 << i : 0).Sum() 
+0

Вид, но мне нужно получить это десятичное число из BitArray сперва –

+0

@VyacheslavShcherbakov делает последнюю строку моего ответа, делая то, что вы хотите? Или вам нужно что-то для больших массивов? –

+0

Большое спасибо –

0

Попробуйте это,

string binary = "0000001010000000"; 

StringBuilder hexvalue= new StringBuilder(binary.Length/8 + 1);   

int Len = binary.Length % 8; 
if (Len != 0) 
{    
    binary = binary.PadLeft(((binary.Length/8) + 1) * 8, '0'); 
} 

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

binary = hexvalue.ToString();   
+0

Спецификация емкости при вызове конструктора 'StringBuilder' не нужна. Кроме того, некоторое объяснение того, что это делает, вероятно, будет очень полезно для OP. – Maarten

0

ваших BitArray множеств и строкового представления не совпадают.

Вы писали 0000001010000000, который на самом деле установить, как это:

BitArray b = new BitArray(16); 
b.Set(6, true); 
b.Set(8, true); 

Но ваш код:

BitArray b = new BitArray(16); 
b.Set(7, true); 
b.Set(9, true); 

фактически производит этот набор цифр:

0000000101000000

Если вы хочу воспроизвести Hex 0280, чем вы должны сделать это:

BitArray b = new BitArray(16); 
b.Set(6, true); 
b.Set(8, true); 

var @string = String.Concat(b.Cast<bool>().Select(x=> { return x ? '1' : '0'; })); 
var result = Convert.ToInt32(@string, 2).ToString("X4"); 

где result будет иметь это значение 0280

+0

Im, считая справа –

Смежные вопросы