Как преобразовать строку двоичных значений обратно в 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;