Чувак, в этом коде много чего происходит, поэтому трудно понять, с чего начать. Достаточно сказать, что ты слишком стараешься. Похоже, вы пытаетесь 1) передать байтовый массив; 2) превратить эти байты в строковое представление двоичного файла; и 3) превратить это строковое представление обратно в значение?
Так получилось, что недавно я сделал что-то похожее на C, которое должно работать с использованием компилятора C ++.
#include <stdio.h>
#include <string.h>
/* A macro to get a substring */
#define substr(dest, src, dest_size, startPos, strLen) snprintf(dest, dest_size, "%.*s", strLen, src+startPos)
/* Pass in char* array of bytes, get binary representation as string in bitStr */
void str2bs(const char *bytes, size_t len, char *bitStr) {
size_t i;
char buffer[9] = "";
for(i = 0; i < len; i++) {
sprintf(buffer,
"%c%c%c%c%c%c%c%c",
(bytes[i] & 0x80) ? '1':'0',
(bytes[i] & 0x40) ? '1':'0',
(bytes[i] & 0x20) ? '1':'0',
(bytes[i] & 0x10) ? '1':'0',
(bytes[i] & 0x08) ? '1':'0',
(bytes[i] & 0x04) ? '1':'0',
(bytes[i] & 0x02) ? '1':'0',
(bytes[i] & 0x01) ? '1':'0');
strncat(bitStr, buffer, 8);
buffer[0] = '\0';
}
}
Чтобы вернуть строку двоичного кода обратно в значение, это можно сделать с помощью сдвига битов:
unsigned char bs2uc(char *bitStr) {
unsigned char val = 0;
int toShift = 0;
int i;
for(i = strlen(bitStr)-1; i >= 0; i--) {
if(bitStr[i] == '1') {
val = (1 << toShift) | val;
}
toShift++;
}
return val;
}
Получив двоичную строку, вы можете взять подстроки из любых произвольных 8 бит (я думаю, меньше) и превратить их обратно в байты.
char *bitStr; /* Let's pretend this is populated with a valid string */
char byte[9] = "";
substr(byte, bitStr, 9, 4, 8);
/* This would create a substring of length 8 starting from index 4 of bitStr */
unsigned char b = bs2uc(byte);
Я на самом деле создал целый набор функций value -> двоичная строка -> value, если вы хотите взглянуть на них. GitHub - binstr