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.

¿Cómo leer el byte hexadecimal ’00’ de un archivo binario?

Tengo una función que guarda una cadena hexadecimal en un archivo binario.

void save_in_binary(std::string& str, std::ofstream& outfile) {
    char buf[3];
    buf[2] = 0;

    std::stringstream input(str);
    input.flags(std::ios_base::hex);
    while (input >> buf[0] >> buf[1]) {
        long val = strtol(buf, nullptr, 16);
        outfile << static_cast<unsigned char>(val & 0xff);
    }
}

Y la otra función que lo lee posteriormente.

int parse_binary_text(std::string& name, std::string& text) {
    std::ifstream myfile(name, std::ios::binary);

    unsigned int tmp = 0;         // flag
    std::stringstream input;
    if (myfile.is_open()) {
        while (!myfile.eof()) {
            tmp = myfile.get();
            if (tmp == UINT_MAX)
                break;
            input << std::hex << tmp;
        }
        text = input.str();
    }
    else
        return 0;
}

Pero al guardar la cadena hexadecimal “0FFE00” y luego leer “FFE0”. Parece que mi función de lectura salta los bytes cero. Al depurar, se mostró que cuando la variable tmp (marcada en el código) es igual a cero, std::hex no escribe nada, ese es el problema. Entonces, surge mi pregunta: ¿cómo puedo solucionar esto?

Tags:  , , , ,

Answer

  1. Avatar for davy.ai

    Para solucionar este problema, puedes modificar la función parse_binary_text agregando una condición para verificar los bytes cero y añadiéndolos a la cadena input stringstream. Aquí tienes una versión actualizada de la función:

    int parse_binary_text(std::string& name, std::string& text) {
        std::ifstream myfile(name, std::ios::binary);
    
        unsigned int tmp = 0;         // indicador
        std::stringstream input;
        if (myfile.is_open()) {
            while (!myfile.eof()) {
                tmp = myfile.get();
                if (tmp == UINT_MAX)
                    break;
                if (tmp == 0) {
                    input << "00";  // agregar bytes cero explícitamente
                }
                else {
                    input << std::hex << tmp;
                }
            }
            text = input.str();
        }
        else
            return 0;
    }
    

    Esto agregará “00” a la cadena input stringstream cuando se encuentre un byte cero en el archivo binario, asegurando que se incluya correctamente en la cadena hexadecimal resultante.

Comments are closed.