在 c 中将二进制 int 转换为二进制uint8_t



>我有一个数组定义为

int data[k];

其中 k 是数组的大小。数组的每个元素都是 0 或 1。我想将二进制数据保存在另一个定义为

uint8_t new_data[k/8];

(k 通常是 8 的倍数(。
如何在 C 中执行此操作?

提前致谢

假设k8的倍数,假设"每个元素都是二进制的",你的意思是"每个int要么0要么1",也假设data中的位从最重要到最不重要,并且new_data的字节被打包为大端序(所有合理的假设(, 那么这就是你的做法:

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];
}

假设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. 因为内部循环具有小的已知边界,并且它写入一个范围很小的变量;这对于优化器来说更容易处理,例如,您可以看到使用 gcc,内部循环完全展开。

最新更新