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 habitué
    Inscrit en
    Avril 2004
    Messages
    504
    Détails du profil
    Informations forums :
    Inscription : Avril 2004
    Messages : 504
    Points : 125
    Points
    125
    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 sénior
    Avatar de koala01
    Homme Profil pro
    aucun
    Inscrit en
    Octobre 2004
    Messages
    11 626
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 52
    Localisation : Belgique

    Informations professionnelles :
    Activité : aucun

    Informations forums :
    Inscription : Octobre 2004
    Messages : 11 626
    Points : 30 684
    Points
    30 684
    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

  3. #3
    Membre habitué
    Inscrit en
    Avril 2004
    Messages
    504
    Détails du profil
    Informations forums :
    Inscription : Avril 2004
    Messages : 504
    Points : 125
    Points
    125
    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 sénior
    Avatar de koala01
    Homme Profil pro
    aucun
    Inscrit en
    Octobre 2004
    Messages
    11 626
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 52
    Localisation : Belgique

    Informations professionnelles :
    Activité : aucun

    Informations forums :
    Inscription : Octobre 2004
    Messages : 11 626
    Points : 30 684
    Points
    30 684
    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

  5. #5
    Membre éprouvé
    Inscrit en
    Avril 2005
    Messages
    1 110
    Détails du profil
    Informations forums :
    Inscription : Avril 2005
    Messages : 1 110
    Points : 937
    Points
    937
    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 habitué
    Inscrit en
    Avril 2004
    Messages
    504
    Détails du profil
    Informations forums :
    Inscription : Avril 2004
    Messages : 504
    Points : 125
    Points
    125
    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