Как я могу преобразовать биты в байты?

Я думаю, что вам нужно преобразовать элемент data в классе ListNode из типа T в array или list в T

9
задан Noldorin 5 April 2009 в 20:50
поделиться

4 ответа

Код рассматривает первый бит как младший бит слова, таким образом, Вы заканчиваете с каждым инвертированным словом. Как быстрая-и-грязная фиксация, попробуйте это:

bytes[byteIndex] |= (byte)(1 << (7-bitIndex));

Это помещает первый бит в массив в самом высоком положении в первом байте и т.д.

10
ответ дан 4 December 2019 в 09:38
поделиться

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

public byte[] ToByteArray(this bool[] bits)
{
    var bytes = new byte[bits.Length / 8];
    for (int i = 0, j = 0; j < bits.Length; i++, j += 8)
    {
        // Create byte from bits where LSB is read first.
        for (int offset = 0; offset < 8; offset++)
            bytes[i] |= (bits[j + offset] << offset);
    }

    return bytes;
}

Примечание: Это перестанет работать, если число битов (bools) не будет несколькими из 8, но оценка по Вашему вопросу, это не имеет место. Это только взяло бы очень маленький modificaiton для разрешения битовых массивов любой длины.

1
ответ дан 4 December 2019 в 09:38
поделиться
bool[] bools = ...
BitArray a = new BitArray(bools);
byte[] bytes = new byte[a.Length / 8];
a.CopyTo(bytes, 0);

Править: На самом деле это также возвращается:

198 12 209 77 203 162 216 50 33 0 196 255 194 231 125 159

Неправильный порядок байтов? Я оставлю ответ так или иначе для ссылки.


Править: Можно использовать BitArray. CopyTo () путем инвертирования массивов как так:

bool[] bools = ...
Array.Reverse(bools); // NOTE: this modifies your original array
BitArray a = new BitArray(bools);
byte[] bytes = new byte[a.Length / 8];
a.CopyTo(bytes, 0);
Array.Reverse(bytes);
5
ответ дан 4 December 2019 в 09:38
поделиться

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

Простой алгоритм:

  1. Создайте массив байтов, которые будут использоваться в качестве Вашего буфера вывода, и инициализировать все байты к 0. Размер этого массива должен быть основан на длине Вашего входного массива булевской переменной: перекройте (bool_array_length / 8.0)

  2. Объявите, что индексная переменная используется в качестве Вашего текущего байта и устанавливает его на 0. Это содержит индекс в Вашем буфере вывода.

  3. Выполните итерации по каждому элементу в Вашем входном массиве булевской переменной.
    3.1. Оставленный сдвиг разряда номер 1 модификацией индекса массива 8. Назовите это число Вашей маской.
    3.2. Вычислите свой индекс байта как Ваш текущий индекс в отделение массива 8.
    3.3. Если у Вас есть булевская переменная true оцените текущий индекс в своем входном массиве булевской переменной, сделайте a bitwise OR с Вашим текущим байтом и Вашей маской.

5
ответ дан 4 December 2019 в 09:38
поделиться
Другие вопросы по тегам:

Похожие вопросы: