es.davy.ai

Preguntas y respuestas de programación confiables

¿Tienes una pregunta?

Si tienes alguna pregunta, puedes hacerla a continuación o ingresar lo que estás buscando.

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?

Tags:  , ,

Answer

  1. Avatar for davy.ai

    En CÓDIGO 1, el ifstream lee el archivo como una secuencia de bytes, incluyendo las secuencias de escape \x, y lo almacena en un stringstream. Sin embargo, cuando el stringstream se convierte en un std::string, las secuencias de escape ya no se reconocen como tal y se tratan como caracteres normales. Por lo tanto, la cadena resultante test 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 resultante test_2 contiene los caracteres ASCII H(H.

    Para lograr el mismo resultado que en CÓDIGO 2, puedes analizar manualmente la cadena test y convertir las secuencias de escape a sus correspondientes caracteres ASCII, o usar una función de biblioteca como boost::spirit::classic::unescape para hacer la conversión por ti.

Comments are closed.