IdentifiantMot de passe
Loading...
Mot de passe oublié ?Je m'inscris ! (gratuit)
Navigation

Inscrivez-vous gratuitement
pour pouvoir participer, suivre les réponses en temps réel, voter pour les messages, poser vos propres questions et recevoir la newsletter

Langage C++ Discussion :

stocké les octets en hexa d'un fichier binaire


Sujet :

Langage C++

  1. #1
    Membre éclairé
    Inscrit en
    Avril 2004
    Messages
    513
    Détails du profil
    Informations forums :
    Inscription : Avril 2004
    Messages : 513
    Par défaut stocké les octets en hexa d'un fichier binaire
    bonsoir à toutes et tous

    je voudrais lire un fichier .jpg donc binaire et chercher l'endroit où sont stockés "les commentaires" dans les données "EXIF"!
    je connais le codage des données EXIF, ce que je voudrais faire c'est de lire par paquet de 4 octets en Hexa et compare aux codes EXIF!
    std::ifstream ifs("G:\\Documents\\Pictures\\2010 TEST\\0004.jpg",std::ios::binary);
    char d;
    while(ifs.read(&d,1))
    {
    std::bitset<CHAR_BIT> bs(d);
    a=bs.to_ulong();
    std::cout<<" hexadecimal : 0x"<<std::hex<<a;
    j'arrive à afficher à l'écran l'octet en hexa mais je ne sais pas le stocké pour le comparer

    je ne sais si je suis clair mais si vous aviez une piste

  2. #2
    Expert éminent
    Avatar de koala01
    Homme Profil pro
    aucun
    Inscrit en
    Octobre 2004
    Messages
    11 643
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 53
    Localisation : Belgique

    Informations professionnelles :
    Activité : aucun

    Informations forums :
    Inscription : Octobre 2004
    Messages : 11 643
    Par défaut
    Salut,

    Il faut bien comprendre que la base utilisée pour l'affichage n'est jamais... qu'une convention, parce que les données (surtout en ce qui concerne les types primitifs) sont toujours stockées sous la forme de valeur binaires.

    Et c'est bien logique: il n'existe que deux états dans un processeur (du moins pour l'instant): 0 le courent ne passe pas, 1 le courent passe

    Au delà de cela, le sens que tu peux donner à un byte (je préfère le terme byte au terme octet, car ce dernier donne la fausse impression qu'un byte est d'office composé de... 8bits, or, ce n'est pas forcément le cas ) ne dépend que de toi

    Par exemple, si tu dispose d'un caractère (de 8 bits, pour faire simple) non signé, les valeurs 11111111 (en binaire), 0xFF (en hexadécimal) et 255 (en décimal) sont... strictement équivalentes, simplement, on utilise des bases différentes, et on dispose donc d'un nombre différents de symboles pour représenter les valeurs

    Mais, si tu décide de considérer deux, quatre ou huit bytes successifs comme une seule et unique valeur, tu travailleras sur 16, 32 ou 64 bits (en considérant qu'un byte en fait 8 ) et tu sera donc en mesure de représenter des valeurs comprises dans une fourchette bien plus grande
    A méditer: La solution la plus simple est toujours la moins compliquée
    Ce qui se conçoit bien s'énonce clairement, et les mots pour le dire vous viennent aisément. Nicolas Boileau
    Compiler Gcc sous windows avec MinGW
    Coder efficacement en C++ : dans les bacs le 17 février 2014
    mon tout nouveau blog

  3. #3
    Membre éclairé
    Inscrit en
    Avril 2004
    Messages
    513
    Détails du profil
    Informations forums :
    Inscription : Avril 2004
    Messages : 513
    Par défaut
    bonsoir
    merci de cette prompte réponse.
    ok je crois avoir saisi ce que tu dits!
    donc dans mon cas lorsque je lis byte par byte mon fichier je suppose que dans ma variable "d" de type char je stoke une suite de 1 et de 0 comme 11111111 par exemple ???
    si c'est bien ça comment je fait pour comparer ce byte à une valeur en hexa
    en plus clair if d=FF alors , comment écrire celà

  4. #4
    Expert éminent
    Avatar de koala01
    Homme Profil pro
    aucun
    Inscrit en
    Octobre 2004
    Messages
    11 643
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 53
    Localisation : Belgique

    Informations professionnelles :
    Activité : aucun

    Informations forums :
    Inscription : Octobre 2004
    Messages : 11 643
    Par défaut
    La comparaison se fera automatiquement dans la bonne base, pour autant que tu préfixe correctement la valeur à tester:
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    14
    15
    16
    17
    18
    19
    20
    int main()
    {
        char c;
        std::ifstream ifs("fichier.dat",std::ios::binary);
        ifs.read(&c);
        /* considérons que c== 1111111 en binaire */
        if(c==011111111)
        {
            std::cout<<"c vaut 11111111 en binaire"<<std::endl;
        }
        if(c==255)
        {
            std::cout<<"c vaut 255 en decimal"<<std::endl;
        }
        if(c==0xFF)
        {
            std::cout<<"c vaut 0xFF en hexadecimal"<<std::endl;
        }
        return 0;
    }
    affichera les trois lignes
    A méditer: La solution la plus simple est toujours la moins compliquée
    Ce qui se conçoit bien s'énonce clairement, et les mots pour le dire vous viennent aisément. Nicolas Boileau
    Compiler Gcc sous windows avec MinGW
    Coder efficacement en C++ : dans les bacs le 17 février 2014
    mon tout nouveau blog

  5. #5
    Membre éclairé
    Inscrit en
    Avril 2005
    Messages
    1 110
    Détails du profil
    Informations forums :
    Inscription : Avril 2005
    Messages : 1 110
    Par défaut
    Citation Envoyé par koala01 Voir le message
    Et c'est bien logique: il n'existe que deux états dans un processeur (du moins pour l'instant): 0 le courent ne passe pas, 1 le courent passe
    Juste une petite précision à ce propos. En réalité il y a 3 états, et c'est peut-être bien le 3ème le plus important:
    1 le courant passe dans un sens (broche, fil, conducteur, etc, relié au "+")
    0 le courant passe dans l'autre sens (broche, fil, conducteur, etc, relié au "-")
    x le courant ne passe pas (broche, fil, conducteur, etc, ouvert)

  6. #6
    Membre éclairé
    Inscrit en
    Avril 2004
    Messages
    513
    Détails du profil
    Informations forums :
    Inscription : Avril 2004
    Messages : 513
    Par défaut
    rebonsoir
    je viens de tester ce petit bout de code
    il faut faire read(&c,1).

    mais je suis sur que le premier byte est 11111111 mais quand je regarde dans le débogueur la valeur est -1 ou un caractère ÿ.
    et si je déclare usigned char pour ma variable j'ai ce message d'erreur :
    error C2664: 'std::basic_istream<_Elem,_Traits>::read'*: impossible de convertir le paramètre 1 de 'unsigned char *' en 'char *'
    et pourquoi en binaire tu commence par un zéro
    /* considérons que c== 1111111 en binaire */
    if(c==011111111)
    encore merci

Discussions similaires

  1. Où sont stockés les fichiers TEMP excel ?
    Par majudis dans le forum Excel
    Réponses: 1
    Dernier message: 10/02/2011, 15h29
  2. Où sont stockés les fichiers?
    Par Mush dans le forum SharePoint
    Réponses: 3
    Dernier message: 18/08/2008, 12h30
  3. Réponses: 9
    Dernier message: 15/04/2008, 10h23
  4. stocké les Logs vers un fichier
    Par yayamo dans le forum Logging
    Réponses: 21
    Dernier message: 13/03/2008, 10h22
  5. fichier ou sont stockées les cmd systemes
    Par dev7 dans le forum Shell et commandes GNU
    Réponses: 2
    Dernier message: 17/04/2007, 23h08

Partager

Partager
  • Envoyer la discussion sur Viadeo
  • Envoyer la discussion sur Twitter
  • Envoyer la discussion sur Google
  • Envoyer la discussion sur Facebook
  • Envoyer la discussion sur Digg
  • Envoyer la discussion sur Delicious
  • Envoyer la discussion sur MySpace
  • Envoyer la discussion sur Yahoo