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 Delphi Discussion :

Ouverture d'un fichier en binaire..


Sujet :

Langage Delphi

  1. #1
    Membre à l'essai
    Profil pro
    Inscrit en
    Février 2005
    Messages
    26
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Février 2005
    Messages : 26
    Points : 16
    Points
    16
    Par défaut Ouverture d'un fichier en binaire..
    Bonjour,

    Je cherche à obtenir l'écriture binaire de n'importe quel fichier (la suite de 0 et de 1 qui le composent).
    Pour l'instant, je n'ai trouvé qu'une solution qui n'est pas satisfaisante:
    1)Ouverture d'un "file of byte"
    2)Lecture byte par byte, ce qui donne le code ascii de chaque byte.
    3)Conversion en binaire du code ascii.

    Ex: Si un fichier contient le caractère 4 (codé 52 en ascii), au final j'obtiens 00110100 (52 converti en base 2). Or ceci ne correspond pas à 4 en base 2, qui serait plutôt 0000100.

    Please help ,

    Merci.

  2. #2
    tintin22
    Invité(e)
    Par défaut
    Je crois qu'à la base l'idée c'est ça, même si je pense qu'une lecture 'File of Byte' ça en fait trop, peut-être vaut mieux penser à TFileStream pour accelerer la lecture, ensuite accéder au fichier une fois chargé en mémoire.
    Pour la representation binaire des chiffre il suffit de faire -48 , ainsi pour 52 tu aura 52-48=4 ; pour 53 tu aura 53-48=5 etc...
    Enfin, si t'es interessé voici le composant MPHexEditor :
    http://www.torry.net/quicksearchd.php?String=mphexeditor&Title=Yes

  3. #3
    Membre averti
    Inscrit en
    Octobre 2005
    Messages
    338
    Détails du profil
    Informations forums :
    Inscription : Octobre 2005
    Messages : 338
    Points : 383
    Points
    383
    Par défaut ouverture d'un fichier rn binaire
    bonjour

    jai déjà travaillé avec des fichiers binaires en utilisant la lecture par bloc dans des tableaux,
    du genre

    var
    F: file of byte
    tableau : array[1..x] of byte;
    begin
    blockRead(F, tableau SizeOf(tableau ), variable);
    tableau[y] est bien la valeur binaire de l'octet lu, si c'était 00000100 dans le fichier dans une variable du type integer tu auras 4 en retour

  4. #4
    Membre à l'essai
    Profil pro
    Inscrit en
    Février 2005
    Messages
    26
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Février 2005
    Messages : 26
    Points : 16
    Points
    16
    Par défaut
    Merci pour vos réponses! Jvais tester les 2 méthodes.
    Mais d'une manière plus générale: comment est on sûr d'obtenir l'unique écriture binaire du fichier? (celle qui découle directement de la polarité des charges magnétiques des plateaux du disque dur)

  5. #5
    Membre expert
    Avatar de e-ric
    Homme Profil pro
    Apprenti chat, bienfaiteur de tritons et autres bestioles
    Inscrit en
    Mars 2002
    Messages
    1 559
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 55
    Localisation : France, Bas Rhin (Alsace)

    Informations professionnelles :
    Activité : Apprenti chat, bienfaiteur de tritons et autres bestioles

    Informations forums :
    Inscription : Mars 2002
    Messages : 1 559
    Points : 3 946
    Points
    3 946
    Par défaut
    Citation Envoyé par kmitz
    Merci pour vos réponses! Jvais tester les 2 méthodes.
    Mais d'une manière plus générale: comment est on sûr d'obtenir l'unique écriture binaire du fichier? (celle qui découle directement de la polarité des charges magnétiques des plateaux du disque dur)
    Bien malin qui pourra te le dire, tout au plus tu pourras avoir des infos sur ce que fait l'OS (Windaube), quant aux polarités du disque dur, c'est un autre problème. En outre, faire des hypothèses sur le mode de stockage physique des données sur un disque donné rendrait ton programme dépendant de ce modèle de disque. Et cela est très rarement (je dirai presque jamais) utile.

    J'ai l'impressison que tu confonds le caractère 4 (pure convention valant numériquement 52 comme tu le soulignes) et la valeur binaire de 4 ce qui n'est pas la même chose. Je pense donc que tu devrais déjà éliminer cette confusion avant de penser à travailler à très bas niveau.

    La façon dont les données seront écrites sur un disque dépend en grande partie de l'usage que tu comptes faire du fichier généré.

    Tentes aussi d'obtenir des infos précises sur la structure de ton fichier et sur le format des données contenues, en connaîs-tu l'auteur ?

    cdlt

    e-ric

    M E N S . A G I T A T . M O L E M
    Debian 64bit, Lazarus + FPC -> n'oubliez pas de consulter les FAQ Delphi et Pascal ainsi que les cours et tutoriels Delphi et Pascal

    "La théorie, c'est quand on sait tout, mais que rien ne marche. La pratique, c'est quand tout marche, mais qu'on ne sait pas pourquoi. En informatique, la théorie et la pratique sont réunies: rien ne marche et on ne sait pas pourquoi!".
    Mais Emmanuel Kant disait aussi : "La théorie sans la pratique est inutile, la pratique sans la théorie est aveugle."

  6. #6
    Expert confirmé
    Avatar de Sub0
    Homme Profil pro
    Développeur Web
    Inscrit en
    Décembre 2002
    Messages
    3 573
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 51

    Informations professionnelles :
    Activité : Développeur Web

    Informations forums :
    Inscription : Décembre 2002
    Messages : 3 573
    Points : 4 219
    Points
    4 219
    Par défaut
    Salut!
    Voici une fonction pour convertir un octet en chaîne binaire et inversement :
    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
    Function ByteToBin(octet: Byte): String;
    Var x: Integer;
    Begin
      Result := '';
      For x := 0 To 7 Do
        Result := IntToStr(Integer(octet And (1 Shl x) > 0)) + Result;
    End;
     
     
    Function BinToByte(bin: String): Byte;
    Var x: Integer;
    Begin
      Result := 0;
      For x := 1 To 8 Do
        Result := Result + StrToInt(Copy(bin, x ,1)) * Round(Power(2, Abs(8 - x)));
    End;
    La fonction Power se trouve dans l'unité Math de Delphi.
    Il existe aussi les fonctions HexToBin et BinToHex dans SysUtils, mais je n'arrive pas bien à les utiliser.

    Pour obtenir le code binaire du caractère "4" à partir de l'octet 52 (en décimal), il faut d'abord utiliser la fonction chr pour obtenir le caractère correspondant à 52, puis utiliser StrToInt pour transformer cette chaine décimale (ici 4) en valeur numérique. Ensuite, la fonction ByteToBin fait la convertion en binaire. Au final, cela donne :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    Label1.Caption := ByteToBin(StrToInt(Chr(52)));
    Cela t'affiche donc 00000100.

    Dans l'hypothèse où ton caractère "4" représenterait un nombre héxadécimal, il faut l'indiquer en ajoutant $ devant. Par exemple, prenons F au lieu de 4 : Le code ascii du caractère F vaut 46 en hexa et 70 en décimal :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    Label1.Caption := ByteToBin(StrToInt('$' + Chr(70)));
    Bref, selon tes besoins, à toi d'utiliser l'un des 2 codes...

    Et pour obtenir la conversion inverse, demande-moi si tu as des difficultés.
    En espèrant t'avoir mis sur le bon chemin...
    à+


    Lien tout en bas à gauche de cette fenêtre
    De retour parmis vous après 10 ans!!

  7. #7
    Membre à l'essai
    Profil pro
    Inscrit en
    Février 2005
    Messages
    26
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Février 2005
    Messages : 26
    Points : 16
    Points
    16
    Par défaut
    En fait ce qui m'a induit en erreur, c'est le fait de croire que le caractère "4" était codé 00000100 dans un fichier, alors qu'en réalité il n'y a aucune raison pour que ça soit le cas.. (M'enfin, avec un peu de bon sens, les créateurs de la convention ASCII aurait pu choisir d'attribuer aux entiers de 0 à 9 leur valeur en binaire, au lieu de leur ajouter 52 puis les convertir en binaire)

  8. #8
    Expert confirmé
    Avatar de Sub0
    Homme Profil pro
    Développeur Web
    Inscrit en
    Décembre 2002
    Messages
    3 573
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 51

    Informations professionnelles :
    Activité : Développeur Web

    Informations forums :
    Inscription : Décembre 2002
    Messages : 3 573
    Points : 4 219
    Points
    4 219
    Par défaut
    Ok. Utilse la fonction Chr pour convertir un Byte en caractère Ascii correspondant et la fonction Ord pour obtenir l'inverse. En tous les cas, n'oublis pas d'ajouter le tag [Résolu] en cliquant sur le lien qui se trouve tout en bas à gauche de cette fenêtre. Cela évitera aux membres du forum de penser que tu es toujours à la recherche d'une solution. à+
    De retour parmis vous après 10 ans!!

+ Répondre à la discussion
Cette discussion est résolue.

Discussions similaires

  1. Probleme lors de l'ouverture d'un fichier binaire
    Par kevinl dans le forum Fortran
    Réponses: 8
    Dernier message: 08/03/2012, 08h36
  2. Ouverture d'un fichier binaire
    Par GriffinK dans le forum C#
    Réponses: 4
    Dernier message: 12/06/2009, 12h04
  3. Ouverture d'un fichier excel predefini
    Par nberthonneau dans le forum Access
    Réponses: 10
    Dernier message: 13/06/2007, 22h14
  4. Réponses: 5
    Dernier message: 27/07/2004, 17h04
  5. Réponses: 2
    Dernier message: 22/07/2002, 12h13

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