Преобразование десятичной в двоичную комбинацию (произвольной длины)

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

Например:

Преобразование десятичной в двоичную комбинацию (произвольной длины)

для фильтра или раздела у меня есть 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 первыми битами. Результат, который я хочу, это

Преобразование десятичной в двоичную комбинацию (произвольной длины)

 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

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

Вы пытаетесь получить или установить фильтр и раздел?

ChrisBD 13.09.2018 10:57

Я добавил пример того, что хочу

Bastien Vandamme 13.09.2018 11:00

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

ChrisBD 13.09.2018 11:11

Скриншот взят из калькулятора Windows, но меня интересует только шестнадцатеричный

Bastien Vandamme 13.09.2018 11:13
Стоит ли изучать PHP в 2023-2024 годах?
Стоит ли изучать PHP в 2023-2024 годах?
Привет всем, сегодня я хочу высказать свои соображения по поводу вопроса, который я уже много раз получал в своем сообществе: "Стоит ли изучать PHP в...
Поведение ключевого слова "this" в стрелочной функции в сравнении с нормальной функцией
Поведение ключевого слова "this" в стрелочной функции в сравнении с нормальной функцией
В JavaScript одним из самых запутанных понятий является поведение ключевого слова "this" в стрелочной и обычной функциях.
Приемы CSS-макетирования - floats и Flexbox
Приемы CSS-макетирования - floats и Flexbox
Здравствуйте, друзья-студенты! Готовы совершенствовать свои навыки веб-дизайна? Сегодня в нашем путешествии мы рассмотрим приемы CSS-верстки - в...
Тестирование функциональных ngrx-эффектов в Angular 16 с помощью Jest
В системе управления состояниями ngrx, совместимой с Angular 16, появились функциональные эффекты. Это здорово и делает код определенно легче для...
Концепция локализации и ее применение в приложениях React ⚡️
Концепция локализации и ее применение в приложениях React ⚡️
Локализация - это процесс адаптации приложения к различным языкам и культурным требованиям. Это позволяет пользователям получить опыт, соответствующий...
Пользовательский скаляр GraphQL
Пользовательский скаляр GraphQL
Листовые узлы системы типов GraphQL называются скалярами. Достигнув скалярного типа, невозможно спуститься дальше по иерархии типов. Скалярный тип...
1
4
114
2

Ответы 2

I try to understand BitArray but I don't understand how to create bit a specific size then fill them easily.

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;
}

i'm only interested by hexadecimal

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

var result = new StringBuilder(bytes.Length * 2);
for (int i = 0; i < bytes.Length; i++)
    result.Append(bytes[i].ToString("X2"));

Я также не знаю, как я могу объединить свои биты vraiables

Bastien Vandamme 13.09.2018 11:32

Вот решение для объединения BitArray: stackoverflow.com/questions/518513/…

György Kőszeg 13.09.2018 11:37

+1 @taffer. Бастьен, если вы имеете дело с BitArray, вам нужно решить, как вы будете обрабатывать размер, который не делится на 16, если вы хотите отобразить результат в шестнадцатеричном формате.

ChrisBD 13.09.2018 11:51

Конкатенация работает, но я все еще не могу правильно преобразовать в гекса. Я отредактировал свой вопрос с помощью кода, который использую. результат и мой ожидаемый результат.

Bastien Vandamme 13.09.2018 12:28

Кажется, что порядок байтов - это не то, что вам нужно. Если вы вставите Reverse после объединенных битов, а также после преобразованных байтов, вы получите 3074. Я создал скрипт, см. Здесь: dotnetfiddle.net/eALFeD - EDIT: достаточно одного реверса, если вы используете Insert в позиции 0 вместо Append при создании шестнадцатеричного результата (рабочий пример изменена).

György Kőszeg 13.09.2018 13:42

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

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

System.Convert.ToString(data, base);

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

Другие вопросы по теме