Чтение двоичного файла в массивы bool в C

Я внедряю DES (с EBC) как часть школьной работы. Я использую логические массивы bool[64] от <stdbool.h> для блоков. Массив использует 1 байт для каждого бита (я научился этому нелегко, когда попробовал memcpy для 64 бит =8 байт вместо 64 байт). Во всяком случае, как вписать в битовый массив? Прямо сейчас я читаю в unsigned long и конвертирую его. Как ниже:

unsigned long buf;
bool I[64], O[64];
int ctr = 0;
while((ctr = fread(&buf, 1, 8, fin))>0) {
    dectobin(buf, I);
    encrypt(I, O);
    buf=bintodec(O);
    fwrite(&buf, 8, 1, fout);
    buf = 0;
}

Функции:

void dectobin(unsigned long dec, bool bin[64]) 
{
    int i;
    for(i = 0; i< 64; i++)
        bin[i] = (dec>>(63-i)) & 1;
}

unsigned long bintodec(bool bin[64])
{
    unsigned long dec = 0;
    int i;
    for(i = 0; i < 64; i++) {
        dec <<= 1;
        dec |= (int)(bin[i]);
    }
    return dec;
}

Есть лучший способ сделать это?

1 ответ

Решение

Вы не можете напрямую читать биты в массиве bool
(вам придется читать байты и назначать каждые 8 ​​бит каждого байта вручную).

Другое решение, которое потребляет меньше памяти:
Массив из 8 символов.
Может быть напрямую обработано, а доступ к битам осуществляется через двоичный код Or/And & |
Если у вас есть символ c и бит номер n между 0 и 7:
Установите бит n в c на 1:

c |= 1<<n;

Установите бит n в c равным 0:

c &= ~(1<<n);

Проверьте, равен ли бит n в c 1:

if(c & (1<<n))
Другие вопросы по тегам