我想在此时读取二进制文件字节,然后将该字节的位存储到整数数组中。同样地,我想将1和0的整数数组(其中8个)写成二进制文件作为字节?
答案 0 :(得分:4)
如果你有一个字节数组:
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]
然后我们执行逻辑AND以清除除我们想要的所有位之外的所有位。
(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)
然后使用逻辑OR设置适当的字节;