通过按位运算将位数组转换为C中的十六进制数组

标签 c arrays bit-manipulation

我正在尝试将一个位数组转换为一个字节数组,但我的操作似乎是按照与我想要的方向相反的方向读取我的位。例如,假设二进制位数组为 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/

相关文章:

c - 通过 HTTP 请求上传文件到 Google Drive (C)

c - 从H264规范中如何理解这一行

java - NIO选择器OP_READ和OP_WRITE,关于处理它们的一些问题

c - 基本控制台应用程序中的循环和 tolower 问题

c - C 中的 token 粘贴不清楚

Java HttpsURLConnection 响应 JSON 数组

ios - 如何将一个数组的tableview数据重新加载到另一个数组?

python - 如何访问通过 Cython 传递的 numpy 数组

c++ - 将零、负和正映射到 0、1、2 的无分支代码

c - LPVOID 和 void* 之间的区别