[英]Turn byte into array of bits? C
我想当时读取二进制文件字节,然后将该字节的位存储到整数数组中。 同样,我想将 1 和 0(其中 8 个)的整数数组作为字节写入二进制文件?
如果您有字节数组:
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)
然后使用逻辑或来设置适当的字节;
在大小为 'sz' 的字节数组 'input' 上完成这项工作的简单 C 程序是:
int i=0,j=0;
unsigned char mask = 0x01u;
for (i=0;i<sz;i++)
for (j=0;j<8;j++)
output[8*i+j]=((unsigned char)input[i] >> j) & (unsigned char)(mask);
声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.