Строго говоря, вам не нужны два цикла, так как два массива перемещаются синхронно с коэффициентом 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 вывода и т. Д.
Это очень хорошо сочетается с принципами работы базовых c циклов и битового сдвига. Вы можете поместить sh биты один за другим в наименее значимый бит выходного массива:
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];
}
Мораль истории состоит в том, что вы должны быть осторожны при определении ваших представлений и данные. Убедитесь, что вы понимаете, где вы хотите, go концептуально, и у вас не будет проблем ни с графическим, ни с внутренним представлением.