Преобразовать десятичную в двоичную комбинацию (произвольной длины) - PullRequest
0 голосов
/ 13 сентября 2018

Мне нужно преобразовать несколько десятичных чисел (или строку, или 1 и 0) в двоичную комбинацию. В .NET я вижу много библиотек, работающих с Byte. Байт - это манипуляция 8 битами. В моем случае я должен работать с набором из 3 бит, который мне нужно объединить вместе.

Например:

enter image description here

для фильтра или раздела У меня есть бит 3 позиции.

Что я должен использовать, чтобы помочь мне в этом виде обращения? В данный момент я пытаюсь понять BitArray, но я не понимаю, как создать бит определенного размера, а затем легко их заполнить.

Вот что я уже сделал

    BitArray headerBits = new BitArray(new bool[] { false, false, true, true, false, false, false, false }); // 8
    BitArray filterBits = new BitArray(new bool[] { false, true, true });  // 11
    BitArray PartitionBits = new BitArray(new bool[] { true, false, true });  // 14
    BitArray CompanyPrefixBits = new BitArray(new bool[] { false, false }); // 16

Давайте попробуем с этими 16 первыми битами. Я хочу получить результат

enter image description here

 3074

РЕДАКТИРОВАТЬ ------

BitArray headerBits = new BitArray(new bool[] { false, false, true, true, false, false, false, false }); // 8
BitArray filterBits = new BitArray(new bool[] { false, true, true });  // 11
BitArray PartitionBits = new BitArray(new bool[] { true, false, true });  // 14
BitArray CompanyPrefixBits = new BitArray(new bool[] { false, false }); // 16

BitArray newBitArray = new BitArray(headerBits.Cast<bool>()
.Concat(filterBits.Cast<bool>())
.Concat(PartitionBits.Cast<bool>())
.Concat(CompanyPrefixBits.Cast<bool>())
.ToArray());

var byteArray = newBitArray.ToByteArray();
Console.WriteLine($"{BitConverter.ToString(byteArray, 0)}");
// Result is 0C-2E
// I expect 30-74

Как это возможно?

Ответы [ 2 ]

0 голосов
/ 13 сентября 2018

Я вижу, что вы читаете данные из метки RFID. Все данные могут рассматриваться как последовательность байтов, поэтому в примерах используются байты.

Если данные должны отображаться в виде строки в шестнадцатеричном формате, я бы посоветовал вам прочитать данные в массив и затем использовать

System.Convert.ToString(data, base);

где данные - это ваше 16-битное значение, а база может быть 2,8, 10, 16 для двоичного, восьмеричного, десятичного или шестнадцатеричного числа.

0 голосов
/ 13 сентября 2018

Я пытаюсь понять BitArray, но я не понимаю, как создать бит определенного размера, а затем легко их заполнить.

BitArray имеет несколько конструкторов.Наиболее очевидным является создание BitArray из массива bool:

var bits = new BitArray(new[] { true, false, true, true });

Другой подход - создать неинициализированный BitArray только с помощью конструктора размера, а затем устанавливать биты один за другим.:

var bits = new BitArray(4); // 4 bits, all false for now
for (int i = 0; i < bits.Length; i++)
    bits[i] = GetMyNextBit();

Обновление:

Если ваша основная проблема заключается в преобразовании объединенных битов в байты, лучше использовать один большой BitArray для всех полей.

После установки всех битов вы можете использовать этот метод расширения:

public static byte[] ToByteArray(this BitArray bits)
{
    byte[] result = new byte[(bits.Length - 1) / 8 + 1];
    bits.CopyTo(result, 0);
    return result;
}

меня интересует только шестнадцатеричное

Youможет легко преобразовать байты в шестнадцатеричную строку:

var result = new StringBuilder(bytes.Length * 2);
for (int i = 0; i < bytes.Length; i++)
    result.Append(bytes[i].ToString("X2"));
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...