Tengo una cadena que contiene el valor hexadecimal:

string str = "e101";

Necesito escribir esto en un archivo como 2 bytes. Mientras intento escribir un archivo, escribirá como el siguiente valor de 4 bytes:

65 31 30 31

Estoy usando la siguiente operación para escribir archivos:

    myfile.open ("file.cf3",std::ios::binary);
    myfile << str << "\n";
    myfile.close();

Pero quiero escribirlo como un valor de 2 bytes.

Por ejemplo, si g ¿Cómo escribirlo como 2 bytes en un archivo?

std::string wut="b6306edf953a6ac8d17d70bda3e93f2a3816eac333d1ac78";

Quiero la salida como

.0n..:j..}p...?*8...3..x
-1
Revathi M 10 may. 2019 a las 10:18

3 respuestas

La mejor respuesta

Creo que su pregunta es ambigua ... Tenga en cuenta que, de su cadena, cada dos caracteres tiene 1 byte (no dos). Por lo tanto, desea escribir dos números (es decir, en ascii) que representen el valor hexadecimal de la cadena ... Si esta es la interpretación correcta, debe dividir la cadena en pares de caracteres y luego convertir cada uno al entero equivalente. Aquí está mi código ... Escribe en stdout, pero puede modificarlo fácilmente para escribir en el archivo en la pantalla.

#include <iostream>
#include <stdio.h>
#include <string>
#include <cstring>
#include <stdlib.h>
using namespace std;

int main () {
        string str = "e101";
        string two_char;
        unsigned char byte;

        for (int i=0 ; i<str.size(); i+=2) {
                two_char = str.substr(i,2);
                byte = strtol(two_char.c_str(),0,16);
                cout << two_char << " " << (int)byte <<"\n";
        }
}
1
Thomas Paoloni 10 may. 2019 a las 08:15

Aquí hay un ejemplo para una solución.

#include <fstream>
#include <iostream>
#include <string>

int main() {
    std::ofstream file("file.txt", std::ios::binary);
    if(!file.is_open())  {
        return -1;
    }
    std::string str("e101");
    for (std::size_t i = 0; i < str.length() - 1; ++++i) {
        file << static_cast<char>(str[i] * 16 + str[i + 1]);
    }
    file.close();
}

Simplemente puede iterar sobre su cadena y tomar dos caracteres como un byte. Multiplica el primer carácter con 16 y agrega el segundo carácter.

1
Thomas Sablik 10 may. 2019 a las 09:27

En respuesta a su pregunta original sobre la escritura de 2 bytes en binario a un archivo en C ++, tiene un proceso básico de 2 pasos. (1) convierta su representación de cadena del número en un valor numérico usando stoi con la base 16. Esto proporciona valores numéricos que puede almacenar en un unsigned short. (2) escriba ese valor en su archivo con f.write, no frwite donde f es su referencia de flujo abierto.

Si desea formatear la salida en hexadecimal para cout, debe establecer los indicadores para cout para que emitan valores numéricos en formato hexadecimal (aunque no es directamente parte de su pregunta, se vincula en la secuencia Formateo de E / S si lo desea).

Entonces, esencialmente tiene su cadena y la convierte en un número, por ejemplo

    std::string str = "e101";
    unsigned short u = stoi(str, 0, 16);

Ahora u tiene un valor numérico convertido del texto en str usando base-16 que simplemente puede escribir en su archivo como un valor de 2 bytes, p.

    std::string filename = "out.bin";   /* output filename */
    ...
    std::ofstream f (filename, f.trunc | f.binary); /* open out in binary */
    if (!f.write(reinterpret_cast<char*>(&u), sizeof u)) {  /* write 2 bytes */
        std::cerr << "error: write of short to file failed.\n";
        return 1;
    }

En resumen, podría hacer algo breve que genere el valor hexadecimal que se escribe con cout, así como escribirlo en el archivo "out.bin", p.

#include <fstream>
#include <iostream>
#include <iomanip>
#include <string>

int main (void) {

    std::string filename = "out.bin";   /* output filename */
    std::string str = "e101";
    unsigned short u = stoi(str, 0, 16);
    /* output converted value to terminal in hex */
    std::cout.setf(std::ios::hex, std::ios::basefield);  /* set hex output */
    std::cout << "writing value to file: " << u << '\n'; /* for cout */
    /* output converted value to file */
    std::ofstream f (filename, f.trunc | f.binary); /* open out in binary */
    if (!f.write(reinterpret_cast<char*>(&u), sizeof u)) {  /* write 2 bytes */
        std::cerr << "error: write of short to file failed.\n";
        return 1;
    }
}

Ejemplo de uso / salida

$ ./bin/stoi_short
writing value to file: e101

Archivo de salida resultante

Confirme volcando el contenido del archivo con un programa hexdump, p.

$ hexdump out.bin
0000000 e101
0000002

Revisa las cosas y avísame si tienes más preguntas.

0
David C. Rankin 10 may. 2019 a las 08:09