Мне нужно преобразовать несколько десятичных чисел (или строку или 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
Как это возможно?
Я добавил пример того, что хочу
Итак, вы пытаетесь отобразить данные в виде текста в шестнадцатеричном, десятичном, восьмеричном или двоичном формате?
Скриншот взят из калькулятора Windows, но меня интересует только шестнадцатеричный
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
Вот решение для объединения BitArray
: stackoverflow.com/questions/518513/…
+1 @taffer. Бастьен, если вы имеете дело с BitArray, вам нужно решить, как вы будете обрабатывать размер, который не делится на 16, если вы хотите отобразить результат в шестнадцатеричном формате.
Конкатенация работает, но я все еще не могу правильно преобразовать в гекса. Я отредактировал свой вопрос с помощью кода, который использую. результат и мой ожидаемый результат.
Кажется, что порядок байтов - это не то, что вам нужно. Если вы вставите Reverse
после объединенных битов, а также после преобразованных байтов, вы получите 3074. Я создал скрипт, см. Здесь: dotnetfiddle.net/eALFeD - EDIT: достаточно одного реверса, если вы используете Insert
в позиции 0 вместо Append
при создании шестнадцатеричного результата (рабочий пример изменена).
Я вижу, что вы читаете данные с RFID-метки. Все данные можно рассматривать как серию байтов, поэтому в примерах используются байты.
Если данные должны отображаться в виде строки в шестнадцатеричном формате, я бы посоветовал вам прочитать данные в массив, а затем использовать
System.Convert.ToString(data, base);
где данные - это ваше 16-битное значение, а база может быть 2,8, 10, 16 для двоичного, восьмеричного, десятичного или шестнадцатеричного.
Вы пытаетесь получить или установить фильтр и раздел?