将二进制文件读入C中的bool数组

时间:2014-01-25 17:02:14

标签: c boolean fread

我正在实施DES(与EBC一起)作为学校工作的一部分。我正在使用来自bool[64]的布尔数组<stdbool.h>作为块。该阵列每个位使用1个字节(当我尝试使用memcpy for 64bits = 8个字节而不是64个字节时,我学到了很多东西)。无论如何,如何进入比特阵列?现在,我正在阅读一个未签名的长并转换它。如下所示:

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 个答案:

答案 0 :(得分:1)

你无法直接在bool数组中找到位 (您必须读取字节并手动分配每个字节的每个8位。)

另一种解决方案,它也消耗更少的内存:
一组8个字符。
可以直接进行预读,并通过二进制或/和&amp; amp;来访问这些位。 |
如果你有一个char c和0到7之间的位数n:
将c中的位n设置为1:

c |= 1<<n;

将c中的位n设置为0:

c &= ~(1<<n);

检查c中的位n是否为1:

if(c & (1<<n))