Как преобразовать строку двоичных значений обратно в 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. Так как у вас есть оригинал char
s хранится в двоичном формате в 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;