Преобразование массивной двоичной входной строки в символьную строку 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-битных двоичных символов.

Любая помощь приветствуется... спасибо!


person T. Pruden    schedule 05.12.2017    source источник


Ответы (3)


Насколько я могу судить, ваша функция binaryToString() не делает того, что вы хотите. Оператор печати просто печатает первые восемь символов адреса, на который указывает char* b.

Вместо этого вы можете преобразовать строку из 8 битов в целое число, используя стандартную функцию Си 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;
}

Я скомпилировал это, и, похоже, он работает нормально. Конечно, это можно сделать чище и безопаснее, но это должно помочь вам начать работу.

person Adam S    schedule 05.12.2017
comment
Да, я просто настроил печать для тестирования... Должно быть, я случайно взял функцию не из того файла. - person T. Pruden; 05.12.2017

Может быть, это может помочь. Я не компилировал, но идея есть. Вы можете зацикливать каждые 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;
}
person burakozgul    schedule 05.12.2017
comment
sizeof(256*char) совпадает с sizeof(int) - недостаточно для этой задачи. Вместо этого предложите result = malloc(sizeof *result * 256);. - person chux - Reinstate Monica; 05.12.2017

Мне просто нужен способ разделить входную строку таким образом, чтобы я мог преобразовывать массивные входные данные из 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

}
person H.S.    schedule 05.12.2017