将字节转换为位数组?C

Jac*_*ack -1 c bit-manipulation

我想当时读取二进制文件字节,然后将该字节的位存储到整数数组中。同样,我想将 1 和 0(其中 8 个)的整数数组作为字节写入二进制文件?

dbu*_*ush 5

如果您有一个字节数组:

unsigned char bytes[10];
Run Code Online (Sandbox Code Playgroud)

并想将其更改为位数组:

unsigned char bits[80];
Run Code Online (Sandbox Code Playgroud)

假设你有每字节 8 位,试试这个:

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

在此循环中,i循环遍历总位数。给定位所在的字节是i/8,作为整数除法向下舍入。该位在一个字节中的位置是i%8

首先,我们为所需的位创建一个掩码:

1 << (i % 8)
Run Code Online (Sandbox Code Playgroud)

然后是所需的字节:

bytes[i/8]
Run Code Online (Sandbox Code Playgroud)

然后我们执行一个逻辑与来清除所有位,除了我们想要的位。

(1 << (i % 8)) & (bytes[i/8])
Run Code Online (Sandbox Code Playgroud)

然后我们将结果右移位位置以将所需位放在最低有效位。这给了我们 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);
}
Run Code Online (Sandbox Code Playgroud)

我们首先清除字节数组,因为我们将一次设置每个字节一位。

然后我们把有问题的一点:

bits[i]
Run Code Online (Sandbox Code Playgroud)

将其移动到其位置:

bits[i] << (i % 8)
Run Code Online (Sandbox Code Playgroud)

然后使用逻辑或来设置合适的字节;