【问题标题】:Reading binary file into bool arrays in C将二进制文件读入C中的bool数组
【发布时间】:2014-01-25 17:02:14
【问题描述】:

我正在实施 DES(与 EBC)作为学校工作的一部分。我正在为块使用来自<stdbool.h> 的布尔数组bool[64]。该数组为每个位使用 1 个字节(当我尝试 memcpy 用于 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;
}

有没有更好的方法来做到这一点?

【问题讨论】:

    标签: c boolean fread


    【解决方案1】:

    您不能直接 fread 布尔数组中的位
    (您必须手动读取字节并分配每个字节的每 8 位)。

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

    c |= 1<<n;
    

    将c中的第n位设置为0:

    c &= ~(1<<n);
    

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

    if(c & (1<<n))
    

    【讨论】:

    • long 会比 char 更好,因为 DES 是 64 位分组密码。但是在 bool 数组中实现操作更容易。
    • 您也可以使用 8 字节长而不是 8 字符。但事实是,你不能在 bool 数组中读取二进制 1/0。
    • 我收回我的评论。 char[8] 更好,因为 char 已知为 1 个字节,但 long 并不总是 8 个字节。
    猜你喜欢
    • 2012-10-13
    • 2016-02-29
    • 2011-05-14
    • 1970-01-01
    • 2021-08-30
    • 2011-12-24
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多