我有一个定义为
的数组int data[k];
其中k是数组的大小。数组的每个元素都是0或1。我想将二进制数据保存在另一个定义为
的数组中uint8_t new_data[k/8];
(k通常是8的倍数)。
我该如何在C语言中做到这一点?
预先感谢
答案 0 :(得分:0)
假设new_data
开始初始化为0,data[i]
仅包含零和一,并且您要首先填充最低位:
for(unsigned i = 0; i < k; ++i) {
new_data[i/8] |= data[i]<<(i%8);
}
可能更快的实现 1 可能是:
for(int i = 0; i < k/8; ++i) {
uint8_t o = 0;
for(int j = 0; j < 8; ++j) {
o |= data[i*8]<<j;
}
new_data[i] = o;
}
(请注意,这实际上是假设k
是8的倍数)
答案 1 :(得分:0)
假设k
是8
的倍数,假设“每个元素都是二进制的”是指“每个int
是0
或1
“,还假设data
中的位从最高有效位到最低有效位被打包,并且new_data
的字节被打包为big-endian(所有合理的假设),那么您将按照以下方式进行操作:< / p>
for (int i = 0; i < k/8; ++i)
{
new_data[i] = (data[8*i ] << 7) | (data[8*i+1] << 6)
| (data[8*i+2] << 5) | (data[8*i+3] << 4)
| (data[8*i+4] << 3) | (data[8*i+5] << 2)
| (data[8*i+6] << 1) | data[8*i+7];
}