Как преобразовать строку двоичных значений обратно в char

пример

примечание: что меня волнуют только письма. таким образом, битсет 000001 будет a или A.

у меня есть string имени s со значением "abc". Я беру каждого char на string и преобразовать его в двоичное значение через использование bitset.

Эл.г

bitset <6> b1 = s[0];   //a
bitset <6> b2 = s[1];   //b
bitset <6> b3 = s[2];   //c

тогда я хочу поместить результаты в array of strings. Имя массива -arr (и каждого string на array будет представлять двоичное значение каждого char)

Эл.г

arr[0]   //will hold the value of char 'a' in binary form which is 000001
arr[1]   //will hold the value of char 'b' in binary form which is 000010
arr[2]   //will hold the value of char 'c' in binary form which is 000011

и то, как я конвертирую каждый char С string в двоичный файл

arr[0] = b1.to_string();    //arr[0] is now 000001
arr[1] = b2.to_string();    //arr[1] is now 000010
arr[2] = b3.to_string();    //arr[2] is now 000011

теперь здесь лежит моя проблема. Как преобразовать их обратно в char?

например

//I want each char to take back the each corresponding letter from the binary values

char c1;   //How do i make the arr[0] value of 000001 to become 'a' again?
char c2;   //Same here
char c3;   //And here

3 ответов


предполагая, что вы хотите начать с ASCII-кода 64, и это 'a' (или 'A') просто 000001 в этом случае вы можете просто сделать

c1 = static_cast<char>(std::bitset<6>(arr[0]).to_ulong() + 64); // 

'A' в десятичной составляет 65, в двоичном составляет 0b01000001. 'a' в десятичной составляет 97, в двоичном составляет 0b01100001. В вашем коде вы используете bitset<6> в магазине 'a' (или 'A'). А bitset<6> может представлять только 2^6 символы, т. е. 64, поэтому вы столкнетесь с резкой. В основном 2 наиболее значимых битов будет разрезан. В этом случае bitset<6>('A') становится 0b000001, то есть 1 в десятичной, и bitset<6>('a') становится 0b1000001, то есть 33 в десятичное. Теперь вы можете убедить себя, что добавление назад 64 производит правильный результат.

редактировать

обратите внимание, что вы также можете использовать std::stoi (только C++11) для преобразования битовой строки из базы 2 в десятичную, как указано в других ответах:

char c1 = static_cast<char>(std::stoi(arr[0], nullptr, 2) + 64);

так как вы заявили, вам больше не нужно std::bitset после преобразования из двоичной обратно в char представление, вы можете избежать его использования для преобразования.

static_cast<char>(std::stoi(arr[i],0,2) + 64);

интерпретирует исходное двоичное представление как базовое 2 (двоичное) число и добавляет 64. Так как у вас есть оригинал chars хранится в двоичном формате в arr массив, вы можете передать их в std::stoi и укажите, что значения являются базовыми 2, в 3-м параметре. std::stoi требует 3 параметра: строка, которую вы пытаетесь преобразовать, указатель на int, который будет хранить индекс первого необращенного символа (ненужный здесь, поэтому может быть оставлен как 0) и база строкового аргумента. вот это. Результат std::stoi вызов является базовым 10 (десятичным) эквивалентом двоичных значений. ответ vsoftco объясняет, почему добавление 64 является подходящей операцией для выполнения здесь после получения десятичного представления. Результат этого возвращается в char.

если вы можете позволить себе использовать больше std::bitset вы даже можете отказаться от добавления 64.

вот демо:

демо


рассмотрим следующее:

 std::cout << "abc" << std::endl;

 std::cout << 'a' << 'b' << 'c' << std::endl;

 std::cout << std::dec
           << static_cast<int>('a') << " "
           << static_cast<int>('b') << " "
           << static_cast<int>('c')  << " "<< std::endl;

 std::cout << std::hex
           << static_cast<int>('a') << " "
           << static_cast<int>('b') << " "
           << static_cast<int>('c')  << " "<< std::endl;

выход

abc

abc

97 98 99

61 62 63

Это показывает, что каждый символ is binary и 97 dec is 0x61 hex.

преобразование (в / из двоичного через битовый набор) не требуется.

(или, возможно, я не понимаю, почему вы ничего не хотите делать несколько сложным образом).

Примечание. это static_cast не вызывает код gen. Обратите внимание, что std::dec и std::hex не изменяют данные, только радиус.

изменить --- Только для 8 бит вы можете рассмотреть это ... никаких проблем с обратным порядком байтов.

 std::cout << ((('a' >> 7) & 1) ? '1' : '0')
           << ((('a' >> 6) & 1) ? '1' : '0')
           << ((('a' >> 5) & 1) ? '1' : '0')
           << ((('a' >> 4) & 1) ? '1' : '0')
           << ((('a' >> 3) & 1) ? '1' : '0')
           << ((('a' >> 2) & 1) ? '1' : '0')
           << ((('a' >> 1) & 1) ? '1' : '0')
           << ((('a' >> 0) & 1) ? '1' : '0') << "  "
           << ((('b' >> 7) & 1) ? '1' : '0')
           << ((('b' >> 6) & 1) ? '1' : '0')
           << ((('b' >> 5) & 1) ? '1' : '0')
           << ((('b' >> 4) & 1) ? '1' : '0')
           << ((('b' >> 3) & 1) ? '1' : '0')
           << ((('b' >> 2) & 1) ? '1' : '0')
           << ((('b' >> 1) & 1) ? '1' : '0')
           << ((('b' >> 0) & 1) ? '1' : '0') << "  "
           << ((('c' >> 7) & 1) ? '1' : '0')
           << ((('c' >> 6) & 1) ? '1' : '0')
           << ((('c' >> 5) & 1) ? '1' : '0')
           << ((('c' >> 4) & 1) ? '1' : '0')
           << ((('c' >> 3) & 1) ? '1' : '0')
           << ((('c' >> 2) & 1) ? '1' : '0')
           << ((('c' >> 1) & 1) ? '1' : '0')
           << ((('c' >> 0) & 1) ? '1' : '0') << "  "
           << std::endl;


 std::cout << std::dec << std::endl;


 // with variable
 char zulu = 'A';

 std::cout << std::dec
           << "NOTE: in this cout, every use of zulu is a 'read' \n"
           << "   zulu: " << zulu                               << "  \n"

           << "   dec : " << std::dec << static_cast<int>(zulu) << "  \n"
           << "   --- : " << zulu                               << "  \n" // zulu not changed

           << "   hex : " << std::hex << static_cast<int>(zulu) << "  \n"
           << "   --- : " << zulu                               << "  \n" // zulu not changed

           << "   bin : "
           << (((zulu >> 7) & 1) ? '1' : '0')
           << (((zulu >> 6) & 1) ? '1' : '0')
           << (((zulu >> 5) & 1) ? '1' : '0')
           << (((zulu >> 4) & 1) ? '1' : '0')
           << (((zulu >> 3) & 1) ? '1' : '0')
           << (((zulu >> 2) & 1) ? '1' : '0')
           << (((zulu >> 1) & 1) ? '1' : '0')
           << (((zulu >> 0) & 1) ? '1' : '0')    << "  \n"
           << "   --- : " << zulu                               << "  \n" // zulu not changed

           << " bitset: " << std::bitset<8>(zulu)               << "  \n"
           << "   zulu: " << zulu                               << "  \n\nzulu not changed!" // zulu not changed

           << std::endl;