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
3 respuestas
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";
}
}
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.
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.
Preguntas relacionadas
Nuevas preguntas
c++
C ++ es un lenguaje de programación de propósito general. Originalmente fue diseñado como una extensión de C, y tiene una sintaxis similar, pero ahora es un lenguaje completamente diferente. Use esta etiqueta para preguntas sobre el código (que se compilará) con un compilador de C ++. Utilice una etiqueta específica de la versión para preguntas relacionadas con una revisión estándar específica [C ++ 11], [C ++ 14], [C ++ 17] o [C ++ 20] etc.