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

Python Discussion :

Ouvrir un fichier en binaire


Sujet :

Python

  1. #1
    Membre actif
    Inscrit en
    Janvier 2004
    Messages
    186
    Détails du profil
    Informations forums :
    Inscription : Janvier 2004
    Messages : 186
    Points : 261
    Points
    261
    Par défaut Ouvrir un fichier en binaire
    Bonjour,
    J'ai regarder les sujets correspondant a mon probleme sans obtenir de resultat, du coup je me permet de poster , en fait j'aurais besoin d'une solution pour ouvrir un fichier de n'importe quel type (.txt,.exe ....) en mode binaire (0101001) afin de recupérer le code binaire pour faire certaines choses dessus.
    Et ensuite restituer le code binaire dans un autre fichier.
    Je mexplique
    j'ai un jeu.exe par exemple
    mon code récupere le code binaire du jeu (0101001)
    et le copier dans un jeu_copie.exe
    qui doit etre identique au précedent.
    J'ai essayer open("monfichier.plop","rb") mais sans résultat quand je le lit il m'affiche du vent, et quand je le copie aussi.
    Si vous pouviez m'aider, Merci ^^

  2. #2
    Membre éclairé
    Avatar de parp1
    Profil pro
    Inscrit en
    Mai 2005
    Messages
    829
    Détails du profil
    Informations personnelles :
    Âge : 39
    Localisation : France, Calvados (Basse Normandie)

    Informations forums :
    Inscription : Mai 2005
    Messages : 829
    Points : 872
    Points
    872
    Par défaut
    Mets du code de ce qu'il taffiche quant meme? On ne sait jamais
    [SIZE="2"]Dis moi qui tu suis, je te dirais qui je Hais!
    Heureux est l'étudiant, qui comme la rivière suit son cours sans sortir de son lit

    Mon premier Tutoriel


    A 80% des cas je résouts mon problème en rédigeant une nouvelle discussion, du coup je ne poste que 20% de mes problèmes...

  3. #3
    Membre expérimenté Avatar de pacificator
    Profil pro
    Inscrit en
    Août 2006
    Messages
    1 074
    Détails du profil
    Informations personnelles :
    Âge : 44
    Localisation : France

    Informations forums :
    Inscription : Août 2006
    Messages : 1 074
    Points : 1 728
    Points
    1 728
    Par défaut
    Que fais tu pour lire ton fichier?
    Si tu fais par exemple:
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    notepad = open('C:\\windows\\system32\\notepad.exe', 'rb')
    data = notepad.read(1024)
    while data:
        print data
        data = notepad.read(1024)
    notepad.close()
    Ca ne te donne toujours rien?
    "Etre conscient de la difficulté permet de l'éviter.."
    Lao-Tseu.

  4. #4
    Membre actif
    Inscrit en
    Janvier 2004
    Messages
    186
    Détails du profil
    Informations forums :
    Inscription : Janvier 2004
    Messages : 186
    Points : 261
    Points
    261
    Par défaut
    Ha si, la il m'affiche plein de symbole bizarre mais pas du binaire.


    Edit :
    Je viens d'essayer sur différent fichiers.
    - sur un .rtf ca marche pas (il m'affiche rien)
    - sur un .txt il m'affiche le texte, comme un read normal
    - sur un .png pareil que sur le .exe

  5. #5
    Membre éclairé
    Avatar de parp1
    Profil pro
    Inscrit en
    Mai 2005
    Messages
    829
    Détails du profil
    Informations personnelles :
    Âge : 39
    Localisation : France, Calvados (Basse Normandie)

    Informations forums :
    Inscription : Mai 2005
    Messages : 829
    Points : 872
    Points
    872
    Par défaut
    Ba je ne pense pas que la console python te retourne les 010110, il te retourne les simbole ascii associe 'je pense' ... mais pas sur du tout.
    [SIZE="2"]Dis moi qui tu suis, je te dirais qui je Hais!
    Heureux est l'étudiant, qui comme la rivière suit son cours sans sortir de son lit

    Mon premier Tutoriel


    A 80% des cas je résouts mon problème en rédigeant une nouvelle discussion, du coup je ne poste que 20% de mes problèmes...

  6. #6
    Membre expérimenté Avatar de pacificator
    Profil pro
    Inscrit en
    Août 2006
    Messages
    1 074
    Détails du profil
    Informations personnelles :
    Âge : 44
    Localisation : France

    Informations forums :
    Inscription : Août 2006
    Messages : 1 074
    Points : 1 728
    Points
    1 728
    Par défaut
    Les caracteres que tu vois sont la representation de ton fichier binaire, les bits sont affiché sous forme d'octets, si tu veux un affichage comme dans matrix, tu peux faire
    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
    21
     
    def oct_to_bin(oct):
        oct = ord(oct)
        retour = []
        for i in range(7, -1, -1):
            if oct - 2**1 >= 0:
                retour.append("1")
                oct = oct - 2**i
            else:
                retour.append("0")
        return "".join(retour)
     
    notepad = open("C:\\windows\\system32\\notepad.exe", 'rb')
    data = notepad.read(1024)
     
    while data:
        for c in data:
            print oct_to_bin(c),
        data = notepad.read(1024)
     
    notepad.close()
    mais ca n'a pas grand interêt..

    Si tu veux faire une copie, utilise le module shutil:
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    >>> import shutil
    >>> help(shutil.copy)
    Help on function copy in module shutil:
     
    copy(src, dst)
        Copy data and mode bits ("cp src dst").
     
        The destination may be a directory.
    Si tu veux interpreter le contenu de ton binaire, utilise le module hachoir
    "Etre conscient de la difficulté permet de l'éviter.."
    Lao-Tseu.

  7. #7
    Membre actif
    Inscrit en
    Janvier 2004
    Messages
    186
    Détails du profil
    Informations forums :
    Inscription : Janvier 2004
    Messages : 186
    Points : 261
    Points
    261
    Par défaut
    Merci ton code m'aide bien,
    mais le probleme c'est qu'il faut qu'avec ce code binaire , je puisse le copier dans un autre fichier (par exemple copie.exe) qui soit la copie conforme de notepad.
    Je viens d'essayer avec ton code mais ca ne marche pas, j'obtiens un copie.exe de 69 mo :/

    edit : je viens de voir ton edit, ceci me permet donc de copier le code binaire d'un programme pour le restituer a l'identique ?
    C'est super (a ceci près je sais je suis chiant :/), qu'il faut en fait que j'extrais le code binaire.
    je te donne un exemple :

    un utilisateur a utilise le programme et extrait le code binaire d'un fichier donné.
    Le code binaire est copier dans un .txt
    le .txt est envoyer a l'utilisateur b, qui grace au programme peut le copier sur un fichier pour obtenir le fichier identique a celui de l'utilisateur b.
    mais il faut donc que le fichier puisse etre copier sans avoir la source sous la main, uniquement a partir de son code binaire. :/

  8. #8
    Membre expérimenté Avatar de pacificator
    Profil pro
    Inscrit en
    Août 2006
    Messages
    1 074
    Détails du profil
    Informations personnelles :
    Âge : 44
    Localisation : France

    Informations forums :
    Inscription : Août 2006
    Messages : 1 074
    Points : 1 728
    Points
    1 728
    Par défaut
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    import shutil
    import os
     
    shutil.copy("C:\\windows\\system32\\notepad.exe", "C:\\")
    os.rename('C:\\notepad.exe', 'C:\\copie_de_notepad.exe')
    "Etre conscient de la difficulté permet de l'éviter.."
    Lao-Tseu.

  9. #9
    Membre actif
    Inscrit en
    Janvier 2004
    Messages
    186
    Détails du profil
    Informations forums :
    Inscription : Janvier 2004
    Messages : 186
    Points : 261
    Points
    261
    Par défaut
    edit : je viens de voir ton edit, ceci me permet donc de copier le code binaire d'un programme pour le restituer a l'identique ?
    C'est super (a ceci près je sais je suis chiant :/), qu'il faut en fait que j'extrais le code binaire.
    je te donne un exemple :

    un utilisateur a utilise le programme et extrait le code binaire d'un fichier donné.
    Le code binaire est copier dans un .txt
    le .txt est envoyer a l'utilisateur b, qui grace au programme peut le copier sur un fichier pour obtenir le fichier identique a celui de l'utilisateur b.
    mais il faut donc que le fichier puisse etre copier sans avoir la source sous la main, uniquement a partir de son code binaire. :/

  10. #10
    Membre expérimenté Avatar de pacificator
    Profil pro
    Inscrit en
    Août 2006
    Messages
    1 074
    Détails du profil
    Informations personnelles :
    Âge : 44
    Localisation : France

    Informations forums :
    Inscription : Août 2006
    Messages : 1 074
    Points : 1 728
    Points
    1 728
    Par défaut
    le .exe et le code binaire, c'et la même chose... sauf que tu a changé l'extension, non?
    "Etre conscient de la difficulté permet de l'éviter.."
    Lao-Tseu.

  11. #11
    Membre actif
    Inscrit en
    Janvier 2004
    Messages
    186
    Détails du profil
    Informations forums :
    Inscription : Janvier 2004
    Messages : 186
    Points : 261
    Points
    261
    Par défaut
    ben non.....
    Je sais pas comment préciser ma pensée...
    En fait j'ai besoin d'avoir la suite de 10000110101 comme tu mas donnée dans ton code au dessus a la seul différence que quand je réecris ce code dans un autre fichier celui-ci soit en tout point identiques a l'original.
    Le probleme est que la quand je réecris le code binaire, ca ne donne aps du tout ce qu'il faut j'ai un fichier de 65mo au lien de 46ko et il ne marche pas..

  12. #12
    Membre expérimenté Avatar de pacificator
    Profil pro
    Inscrit en
    Août 2006
    Messages
    1 074
    Détails du profil
    Informations personnelles :
    Âge : 44
    Localisation : France

    Informations forums :
    Inscription : Août 2006
    Messages : 1 074
    Points : 1 728
    Points
    1 728
    Par défaut
    Tu as juste besoin de copier ton .exe, il contient le code binaire même si l'affichage te donne pas de 0 et de 1, c'est du binaire!
    Pourquoi vouloir des 0 et des 1??
    Je crois que tu te prends la tête pour rien, utilise shutil.copy, pas besoin de voir les elements binaires, ils y sont.
    "Etre conscient de la difficulté permet de l'éviter.."
    Lao-Tseu.

  13. #13
    Membre actif
    Inscrit en
    Janvier 2004
    Messages
    186
    Détails du profil
    Informations forums :
    Inscription : Janvier 2004
    Messages : 186
    Points : 261
    Points
    261
    Par défaut
    Bon je t'exlique completement ma pensée..
    Je fais des test sur des systeme de compréssion de fichier, j'ai besoin du code binaire d'un fichier, afin de le stocker dans une image, d'envoyer cette image a un utilisateur qui a partir de l'image et donc du code binaire que le programme extrairas de l'image pourras reconstituer le fichier de base.
    C'est pour ca que j'ai besoin du code binaire ^^

  14. #14
    Membre éclairé
    Avatar de parp1
    Profil pro
    Inscrit en
    Mai 2005
    Messages
    829
    Détails du profil
    Informations personnelles :
    Âge : 39
    Localisation : France, Calvados (Basse Normandie)

    Informations forums :
    Inscription : Mai 2005
    Messages : 829
    Points : 872
    Points
    872
    Par défaut
    Citation Envoyé par Slade991
    un utilisateur a utilise le programme et extrait le code binaire d'un fichier donné.
    Le code binaire est copier dans un .txt
    Si tu copie un fichier binaire dans du Txt ce n'est plus un fichier binaire.Puisque un fichier txt est encode, chaque binaire que tu envoies dedans et transcrit dans langage. ICI l'ascii.

    Si tu envoi la valeur binaire 41 en hexadecimal, a toi de t'aumser pour convertir, tu aura normalement un "A" dans ton texte.
    Les 1 et 0 sont visible qu'au point de vu informatique.

    C'est assez complexe a cerner ton probleme?...
    Donc si tu veux voire les Un et les Zeros...c'est pas comme ca.
    [SIZE="2"]Dis moi qui tu suis, je te dirais qui je Hais!
    Heureux est l'étudiant, qui comme la rivière suit son cours sans sortir de son lit

    Mon premier Tutoriel


    A 80% des cas je résouts mon problème en rédigeant une nouvelle discussion, du coup je ne poste que 20% de mes problèmes...

  15. #15
    Membre expérimenté Avatar de pacificator
    Profil pro
    Inscrit en
    Août 2006
    Messages
    1 074
    Détails du profil
    Informations personnelles :
    Âge : 44
    Localisation : France

    Informations forums :
    Inscription : Août 2006
    Messages : 1 074
    Points : 1 728
    Points
    1 728
    Par défaut
    ok, de la steganographie, fallait le dire tout de suite....
    Tu peux utiliser la valeur ascii des octets contenus dans ton programme, ses valeurs allant de 0 à 255, interessant à manipuler dans une image:
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    import os
     
    notepad = open("C:\\windows\\system32\\notepad.exe", 'rb')
    valeurs = [ord(c) for c in notepad.read()]
    notepad.close()
    # print valeurs
    open('nouveau.exe', 'wb').write("".join([chr(v) for v in valeurs]))
     
    os.open('nouveau.exe')
    "Etre conscient de la difficulté permet de l'éviter.."
    Lao-Tseu.

  16. #16
    Membre actif
    Inscrit en
    Janvier 2004
    Messages
    186
    Détails du profil
    Informations forums :
    Inscription : Janvier 2004
    Messages : 186
    Points : 261
    Points
    261
    Par défaut
    ^^
    L'ecriture dans le texte est un exemple, disons qu'en fait il faut juste que mon programme soit capable de travailler sur le code binaire, et a l'inverse soit capable de restituer le fichier a partir de son code binaire, c'est la ou est le probleme, avoir le code binaire c'ets bon grace au code de pacificator (merci bien d'alleurs ^^) mais maintenant il faut qu'a partir de ce code j'arrive a restituer le fichier d'origine, j'essaye de trouver une solution depuis tout a l'heure mais je trouve pas :/

  17. #17
    Membre actif
    Inscrit en
    Janvier 2004
    Messages
    186
    Détails du profil
    Informations forums :
    Inscription : Janvier 2004
    Messages : 186
    Points : 261
    Points
    261
    Par défaut
    Ce n'est pas vraiment de stéganographie.
    Oui le valeurs ascii ca peut etre simpa, mais le probleme c'ets que ca va pas etre optimale.
    Mon but est de compresser les fichier dasn une image, chaque pixel de mon image doit stocké un chaine de 010101 , qui sera defini dans une table de correspondance, par exemple 11111110000000 sera egale a rvb(1,0,0) (c'ets une théorie j'ai besoin de faire des tests) et le probleme de faire ca en ascii c'est que il y a beacoup plus de possibilité de chaine différente qu'en binaire, donc moins de chance de trouver une chaine correspondante dans le fichier. C'est pour cela que le binaire est la meilleur solution pour moi :/
    Et c'ets pour cela que j'ai besoin d'avoir le code binaire sous la main et la possibilté avec les valeur binaires de reconstituer le fichier.

  18. #18
    Membre actif
    Inscrit en
    Janvier 2004
    Messages
    186
    Détails du profil
    Informations forums :
    Inscription : Janvier 2004
    Messages : 186
    Points : 261
    Points
    261
    Par défaut
    j'ai essayer de modifier le code pour aboutir au bon resultat :
    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
    import os
    def oct_to_bin(oct):
        oct = ord(oct)
        retour = []
        for i in range(7, -1, -1):
            if oct - 2**1 >= 0:
                retour.append("1")
                oct = oct - 2**i
            else:
                retour.append("0")
        return "".join(retour)
    notepad = open("C:\\windows\\system32\\notepad.exe", 'rb')
    valeurs = [c for c in notepad.read()]
    valeur2 = [oct_to_bin(d) for d in valeurs]
    for a in valeur2 :
        print a
    notepad.close()
    #print valeurs
    open('nouveau.exe', 'wb').write("".join([v for v in valeur2]))
    J'arrive a un .exe de 440ko c'est deja mieux !
    Mais ca marche pas ^^

  19. #19
    Membre expérimenté Avatar de pacificator
    Profil pro
    Inscrit en
    Août 2006
    Messages
    1 074
    Détails du profil
    Informations personnelles :
    Âge : 44
    Localisation : France

    Informations forums :
    Inscription : Août 2006
    Messages : 1 074
    Points : 1 728
    Points
    1 728
    Par défaut
    un peu plus optimisé:

    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
    p2 = [2**i for i in range(7)]
     
    def dec_to_bin(nb):
        return [nb & p and 1 or 0 for p in p2]
     
     
    def char_to_bin(c):
        return b10_to_b2[ord(c)]
     
     
    b10_to_b2 = {}
    for i in range(256):
        b10_to_b2[i] = dec_to_bin(i)
     
     
    print '\n'.join(["%d\t%s" % (k, str(v)) for k, v in b10_to_b2.iteritems()])
    Concernant la manipulation des images, je te conseille de lire le tutoriel de parp1 sur l'utilisation de numpy avec des images, interessant et utile pour pour ton projet.
    "Etre conscient de la difficulté permet de l'éviter.."
    Lao-Tseu.

Discussions similaires

  1. Ouvrir un fichier stocké en BD sous forme binaire !
    Par rad_hass dans le forum ASP.NET
    Réponses: 5
    Dernier message: 14/05/2008, 18h05
  2. Ouvrir un fichier en mode binaire.
    Par _christophe_ dans le forum Général Python
    Réponses: 20
    Dernier message: 14/05/2008, 06h28
  3. Ouvrir un fichier dans son code binaire
    Par Zaki_SDwin dans le forum Débuter
    Réponses: 8
    Dernier message: 07/03/2008, 14h55
  4. Ouvrir le fichier d'entrée standard en binaire
    Par bubulemaster dans le forum Débuter
    Réponses: 5
    Dernier message: 05/12/2007, 12h06
  5. Réponses: 2
    Dernier message: 26/04/2004, 13h55

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