我正在尝试将一个位数组转换为一个字节数组,但我的操作似乎是按照与我想要的方向相反的方向读取我的位。例如,假设二进制位数组为 10110111 11000000 00000110
。我希望字节数组为 {B7, C0, 06}
。相反,我下面的代码会生成 {ED, 03, 60}
的输出,即它以相反方向每 8 位读取一次。谁能给我一些关于我哪里出错的建议?
void find_hex_arr(uint8_t* bit_arr, int bit_len) {
uint8_t* hex_arr = malloc(bit_len/8);
int index = 0;
unsigned int i = 0;
unsigned int j = 0;
for (i = 0; i < bit_len; i = j) {
for (j = i; j < i + 8; ++j) {
hex_arr[index] |= bit_arr[j] << (j - i);
}
index++;
}
}
最佳答案
严格来说,您不需要两个循环,因为两个数组以锁步方式移动,最高可达 8 倍。
您的输入数组如下:
uint8_t bit_arr[] = {
1, 0, 1, 1, 0, 1, 1, 1,
1, 1, 0, 0, 0, 0, 0, 0,
0, 0, 0, 0, 0, 1, 1, 0};
所需的输出是
uint8_t expected[] = {0xB7, 0xC0, 0x06}
请注意,在此表示中最高有效位位于最前面。数组中的位 0-8 是输出的字节 0 中的最高到最低有效位,依此类推。
这与基本循环和位移位的工作原理非常吻合。您可以将这些位一位一位插入输出数组的最低有效位:
uint8_t *hex_arr = malloc(bit_len / 8);
memset(hex_arr, 0, bit_len / 8);
for(int i = 0; i < bit_len; i++) {
hex_arr[i / 8] <<= 1;
hex_arr[i / 8] += bit_arr[i];
}
这个故事的寓意是,您必须谨慎定义表示和数据。确保您从概念上理解您希望事情发展到哪里,并且您不会在图形或内部表示方面遇到问题。
关于通过按位运算将位数组转换为C中的十六进制数组,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/62096814/