una letra ejemplos dev convertir como cadena binario c++ arrays string binary bitset

c++ - letra - Cómo convertir cadena de valores binarios a char



decimal a binario en c (3)

Ejemplo

NOTA: que solo estoy preocupado por las letras. entonces el conjunto de bits 000001 sería a o A

Tengo una string llamada s con el valor "abc" . Tomo cada char de la string y la convierto en valor binario mediante el uso de bitset .

p.ej

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

entonces quiero poner los resultados en una array de strings . El nombre de la matriz es arr (y cada string de la array representará el valor binario de cada char )

p.ej

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

y la forma en que convierto cada char de la string al binario es

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

Ahora aquí yace mi problema. ¿Cómo los convierto de nuevo en char ?

p.ej

//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


Asumiendo que quiere comenzar en el código ASCII 64, y que ''a'' (o ''A'' ) es simplemente 000001 en ese caso, entonces simplemente puede hacer

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

''A'' en decimal es 65 , en binario es 0b01000001 . ''a'' en decimal es 97 , en binario es 0b01100001 . En su código, usa un conjunto de bitset<6> para almacenar ''a'' (o ''A'' ). Un conjunto de bitset<6> solo puede representar 2^6 símbolos, es decir, 64 , por lo que encontrará corte. Básicamente se cortarán los 2 bits más significativos. En este caso, conjunto de bitset<6>(''A'') convierte en 0b000001 , es decir, 1 en decimal, y conjunto de bitset<6>(''a'') convierte en 0b1000001 , es decir, 33 en decimal. Ahora puede convencerse de que agregar nuevamente 64 produce el resultado correcto.

EDITAR

Tenga en cuenta que también puede usar std::stoi (solo C ++ 11) para convertir la cadena de bits de la base 2 a decimal, como se menciona en las otras respuestas:

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


Como usted indicó que ya no necesita std::bitset después de convertir de binario a su representación char , puede evitar usarlo para la conversión.

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

Interpreta la representación binaria original como un número base 2 (binario) y agrega 64. Dado que tiene las char originales almacenadas en un formato binario en la matriz de arr , puede pasarlas a std::stoi y especificar que los valores son base 2, en el 3er parámetro. std::stoi requiere 3 parámetros: la cadena que está tratando de convertir, un puntero a un int que almacenará el índice del primer carácter no convertido (no es necesario aquí, entonces puede dejarse como 0 ) y la base de la cadena argumento. Aquí hay más información sobre eso . El resultado de la llamada std::stoi es el equivalente de base 10 (decimal) de los valores binarios. La respuesta de vsoftco explica por qué agregar 64 es la operación apropiada para hacer aquí después de obtener una representación decimal. El resultado de esto se devuelve como un char .

Si puede permitirse usar un std::bitset más grande, puede incluso eliminar el agregado de 64.

Aquí hay una demostración en vivo:

Manifestación


considera lo siguiente:

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;

con salida

a B C

a B C

97 98 99

61 62 63

Esto muestra que cada char es binario, y 97 dec es 0x61 hex.

La conversión (a / desde binario mediante bitset) no es necesaria.

(o quizás no entiendo por qué no quieres hacer nada de una manera algo complicada).

Tenga en cuenta que static_cast <> no genera código gen. Tenga en cuenta que std :: dec y std :: hex no cambian a los datos, solo a la raíz.

editar --- Solo por 8 bits, podrías considerar esto ... sin problemas endian.

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;