2017-01-17 2 views
-1

Я хочу прочитать двоичный файл байта в то время, а затем сохранить бит этого байта в целочисленный массив. И аналогичным образом я хочу написать целочисленный массив из 1s и 0s (8 из них) в двоичный файл в виде байтов?Включить байт в массив бит? C

+0

I/O в основном не работает по частям. Насколько я знаю, вы можете читать байты по байтам с функцией чтения и размером буфера 1. – chris01

+0

Вы можете использовать битовую маску 1 и обходить по вашему входу, но на самом деле это не совсем экономично, чтобы превратить один бит в то, что эффективно 32 бит. Вы можете попробовать массив символов для хранения групп по 8 бит и использовать битхиттинг и маски для доступа к отдельным битам. – synchronizer

+0

Слышали ли вы о смещении бит и побитовых операциях? –

ответ

3

Если у вас есть массив байтов:

unsigned char bytes[10]; 

И хотите, чтобы изменить его в массив битов:

unsigned char bits[80]; 

И если у вас есть 8 бит на байт, попробуйте это:

int i; 
for (i=0; i<sizeof(bytes)*8; i++) { 
    bits[i] = ((1 << (i % 8)) & (bytes[i/8])) >> (i % 8); 
} 

В этом цикле i проходит через общее количество бит. Байт, в котором находится данный бит, равен i/8, который как целое деление округляется вниз. Положение бит в байте составляет i%8.

Сначала мы создаем маску для нужного бита:

1 << (i % 8) 

Затем желаемый байт:

bytes[i/8] 

Затем мы выполняем логическое И, чтобы очистить все биты, кроме того, мы хотим.

(1 << (i % 8)) & (bytes[i/8]) 

Затем мы сдвигаем результат в соответствии с положением бит, чтобы поместить желаемый бит в наименьший значащий бит. Это дает нам значение 1 или 0.

Обратите внимание также, что указанные массивы: unsigned. Это необходимо для правильной работы бит-сдвига.

Для переключения:

int i; 
memset(bytes, 0, sizeof(bytes)); 
for (i=0; i<sizeof(bytes)*8; i++) { 
    bytes[i/8] |= bits[i] << (i % 8); 
} 

Мы начинаем убирая массив байтов, так как мы будем настройки каждого байта один бит за один раз.

Тогда мы возьмем немного в вопросе:

bits[i] 

сдвигает его в его положение:

bits[i] << (i % 8) 

Затем с помощью логического ИЛИ установить соответствующие байты;

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