-1
votes

Besoin d'écrire une chaîne dans un fichier au format hexadécial en C ++

J'ai une chaîne qui contient la valeur hexagonale: xxx pré>

J'ai besoin d'écrire ceci dans un fichier sous forme de 2 octets. Bien que j'essaie d'écrire un fichier, il va écrire comme la valeur 4 octets suivante: p> xxx pré>

J'utilise l'opération suivante pour le fichier écrire: p>

.0n..:j..}p...?*8...3..x


10 commentaires

fwrite (A C Funciton), ne prend pas std :: string comme premier argument, il faut char * . (Vous devrez convertir STR vers une valeur courte non signé avant appeler fwrite ), puis vous écrirez Tailleof (court) < / Code> Nombre d'octets, pas str.size () octets ... aussi pour "65 31 30 31" Voir ascitable .


Vous voulez donc les deux octets 0xE1 et 0x01 pour être écrit dans votre fichier? S'il vous plaît Modifier votre question et faites cela clair. Votre titre de question est également trompeur, cela n'a rien à voir avec SHA.


Oui, je veux l'écrire comme seulement 2 octets de valeur


Dupliqué possible de Convertir un tableau de caractères en format binaire Hex C ++


OK, vous avez étiqueté cette question C ++, mais ce que vous montrez est C. Les langues sont très différentes. Vous pouvez appeler c fonctions en C ++, mais si vous êtes censé écrire ceci en C ++, vous pouvez utiliser l'interface de flux de fichiers C ++ au lieu du code C fwrite avec std :: ios_base :: openmode - binaire


Duplication de Stackoverflow.com/questions/21819782/ écrit-hex-to-a-file-c


@Revathaim S'il vous plaît laissez-nous savoir si vous écrivez en C ou en C ++.


J'écris à C ++ uniquement.


Comme si je donne une corde comme celle-ci std :: string wut = "b6306edf953a6ac8d17d70bda3e93f2a3816ac33f2a3816ac333d1ac78"; J'ai besoin de sortie comme .0n ..: j ..} P ...? .. .3..x


@Revathaim S'il vous plaît ne postez pas de tonnes de commentaires, mais Modifier Votre question et mettez toutes les informations pertinentes . Regardez également les duplicats mentionnés dans les commentaires. Si vous écrivez en C ++, fwrite (STR, 1, STR.SIZE (), FPTR) est le plus probable de toute façon, si cela fonctionne, si cela fonctionne, vous avez une plate-forme non standard.


3 Réponses :


0
votes

En réponse à votre question initiale sur l'écriture de 2 bytes en binaire à un fichier en C ++, vous avez un processus de base en 2 étapes. (1) Convertissez la représentation de votre chaîne du numéro à une valeur numérique à l'aide de stoi code> avec la base 16 code>. Ceci fournit une valeur numérique que vous pouvez stocker dans un abrégé non signé code>. (2) Écrivez cette valeur dans votre fichier avec f.write code>, pas frwite code> où f code> est votre référence de flux ouvert.

Si Vous souhaitez formater la sortie dans HEX pour COUT CODE>, vous devez définir les indicateurs de COUT CODE> pour sortir les valeurs numériques en format HEX (bien que cela ne fait pas directement partie de votre question, Il est lié dans le formatage d'E / S flux si vous le souhaitez.) p>

si essentiellement que vous avez votre chaîne et la convertissez-la en un nombre, par exemple p> xxx pré>

maintenant u code> contient une valeur numérique convertie du texte dans STR code> en utilisant base-16 EM> que vous pouvez simplement écrire dans votre fichier en tant que valeur de 2 octets, par exemple p> xxx pré>

la mettant complètement, vous pouvez faire quelque chose de court qui génère la valeur hexagonale écrite avec COUT code> ainsi que l'écrire dans le fichier "out.bin" code>, par exemple p> xxx pré>

Exemple d'utilisation / Sortie FORT> P>

$ hexdump out.bin
0000000 e101
0000002


0 commentaires

1
votes

Voici un exemple pour une solution.

#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();
}


0 commentaires

1
votes

Je pense que votre question est ambiguë ... Gardez à l'esprit que, de votre chaîne, tous les deux, vous avez 1 octet (pas deux). Donc, vous voulez écrire deux chiffres (signification en ASCII) représentant la valeur hexagonale de la chaîne ... S'il s'agit de la bonne interprétation, vous devez diviser la chaîne par paires de caractères, puis convertir chacun entier équivalent. Voici mon code ... Il écrit à STDOUT, mais vous pouvez le modifier facilement pour écrire au fichier à l'écran.

#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";
        }
}


0 commentaires