Преобразование массивной двоичной входной строки в символьную строку C
Я совсем не знаком с C, так что это может быть простой проблемой для решения. Я пытаюсь взять входной массив char * последовательности двоичных символов, напр. "0100100001101001" и выведите его относительную строку ("Привет"). Проблема, которую я имею, состоит в том, чтобы придумать способ разделить входные данные на отдельные строки длиной 8, а затем преобразовать их по отдельности, чтобы получить полную выходную строку.
char* binaryToString(char* b){
char binary[8];
for(int i=0; i<8; ++i){
binary[i] = b[i];
}
printf("%s", binary);
}
Я знаю, как преобразовать 8-битный в его символ, мне просто нужен способ разбить входную строку таким образом, чтобы я мог преобразовать массивные входные данные 8-битных двоичных символов.
Любая помощь приветствуется... спасибо!
3 ответа
Из того, что я могу сказать, ваша функция binaryToString() не делает то, что вы хотите. Оператор print просто печатает первые восемь символов с адреса, на который указывает char* b.
Вместо этого вы можете преобразовать строку из 8 битов в целое число, используя стандартную функцию C strtol(). Больше нет необходимости конвертировать, потому что двоичные, шестнадцатеричные, десятичные и т. Д. - это просто представления одних и тех же данных! Поэтому, когда строка преобразуется в длинную, вы можете использовать это значение для представления символа ASCII.
Обновляя реализацию (как показано ниже), вы можете использовать ее для печати всей последовательности.
#include <stdio.h>
#include <string.h>
void binaryToString(char* input, char* output){
char binary[9] = {0}; // initialize string to 0's
// copy 8 bits from input string
for (int i = 0; i < 8; i ++){
binary[i] = input[i];
}
*output = strtol(binary,NULL,2); // convert the byte to a long, using base 2
}
int main()
{
char inputStr[] = "01100001011100110110010001100110"; // "asdf" in ascii
char outputStr[20] = {0}; // initialize string to 0's
size_t iterations = strlen(inputStr) / 8; // get the # of bytes
// convert each byte into an ascii value
for (int i = 0; i < iterations; i++){
binaryToString(&inputStr[i*8], &outputStr[i]);
}
printf("%s", outputStr); // print the resulting string
return 0;
}
Я скомпилировал это, и, кажется, работает нормально. Конечно, это можно сделать чище и безопаснее, но это должно помочь вам начать работу.
Мне просто нужен способ разбить входную строку таким образом, чтобы я мог преобразовывать массивные входные данные из 8-битных двоичных символов.
Ты можешь использовать strncpy()
скопировать последовательность '0'
а также '1'
в куске 8
символов за раз от входной строки, что-то вроде этого:
//get the size of input string
size_t len = strlen(b);
//Your input array of '0' and '1' and every sequence of 8 bytes represents a character
unsigned int num_chars = len/8;
//Take a temporary pointer and point it to input string
const char *tmp = b;
//Now copy the 8 chars from input string to buffer "binary"
for(int i=0; i<num_chars; ++i){
strncpy(binary, tmp+(i*8), 8);
//do your stuff with the 8 chars copied from input string to "binary" buffer
}
Может быть, это может помочь. Я не компилировал это, но есть идея. Вы можете зациклить каждые 8 бит отдельно с помощью цикла while. И назначить 8-битный двоичный массив с помощью цикла for. После этого отправьте этот двоичный массив в функцию convert8BitToChar, чтобы получить буквенный эквивалент 8 бит. Затем добавьте букву в массив результатов. Я сейчас пишу c на 3 года, если есть ошибки извините об этом. Здесь псевдокод.
char* binaryToString(char* b){
char* result = malloc(sizeof(256*char));
char binary[8];
int nextLetter = 0;
while (b[nextLetter*8] != NULL) { // loop every 8 bit
for(int i=0; i<8; ++i){
binary[i] = b[nextLetter*8+i];
}
result[nextLetter] = 8bitToChar(binary));// convert 8bitToChar and append yo result
nextLetter++;
}
result[nextLetter] = '\0';
return result;
}