Forma correcta de convertir HEX a ASCII leído desde un archivo en C++
En mi código de abajo, CÓDIGO 1
al leer HEX de un archivo y almacenarlo en un vector de cadenas, no lo convierte a ASCII
al imprimirlo.
#include <iostream>
#include <sstream>
#include <fstream>
int main(int argc, char** argv)
{
// CÓDIGO 1
std::ifstream input("C:\\test.txt"); // El archivo test.txt contiene \x48\x83\xEC\x28\x48\x83
std::stringstream sstr;
input >> sstr.rdbuf();
std::string test = sstr.str();
std::cout << "\nCadena desde el archivo: " << test;
//char* lol = new char[test.size()];
//memcpy(lol, test.data(), test.size());
///////////////////////////////////////////////////////
// CÓDIGO 2
std::string test_2 = "\x48\x83\xEC\x28\x48\x83";
std::cout << "\n\nCadena codificada: " << test_2 << "\n";
// Imprime como ASCII "H(H", que es lo que quiero que haga mi CÓDIGO 1.
}
En mi ejemplo de CÓDIGO 2
, se utiliza el mismo HEX
y se imprime como ASCII
. ¿Por qué no ocurre lo mismo con el CÓDIGO 1
?
davy.ai
En
CÓDIGO 1
, elifstream
lee el archivo como una secuencia de bytes, incluyendo las secuencias de escape\x
, y lo almacena en unstringstream
. Sin embargo, cuando elstringstream
se convierte en unstd::string
, las secuencias de escape ya no se reconocen como tal y se tratan como caracteres normales. Por lo tanto, la cadena resultantetest
contiene los bytes reales\x48\x83\xEC\x28\x48\x83
y no su representación en ASCII.En
CÓDIGO 2
, las secuencias de escape\x
se usan directamente en la definición de la cadena, lo que significa que se reconocen como caracteres especiales y se convierten a su representación en ASCII. Por lo tanto, la cadena resultantetest_2
contiene los caracteres ASCIIH(H
.Para lograr el mismo resultado que en
CÓDIGO 2
, puedes analizar manualmente la cadenatest
y convertir las secuencias de escape a sus correspondientes caracteres ASCII, o usar una función de biblioteca comoboost::spirit::classic::unescape
para hacer la conversión por ti.