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 :

Ecrire un fichier bit à bit


Sujet :

Python

  1. #1
    Membre régulier
    Homme Profil pro
    .
    Inscrit en
    Octobre 2014
    Messages
    174
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 40
    Localisation : France, Essonne (Île de France)

    Informations professionnelles :
    Activité : .
    Secteur : High Tech - Éditeur de logiciels

    Informations forums :
    Inscription : Octobre 2014
    Messages : 174
    Points : 90
    Points
    90
    Par défaut Ecrire un fichier bit à bit
    Bonjour,

    Je recherche actuellement le moyen d'écrire dans un fichier des données de longueur de bit variable.
    Exemple:
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
     write("011")
     write("1101101")
     write("1001")
    File -> 01111011011001

    J'ai essayé avec des librairies tels que "bitstring" mais le fichier de sortie est, en taille, bien supérieur au résultat attendu.

    Des suggestions?

    Merci à vous

  2. #2
    Expert éminent sénior
    Homme Profil pro
    Architecte technique retraité
    Inscrit en
    Juin 2008
    Messages
    21 287
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Manche (Basse Normandie)

    Informations professionnelles :
    Activité : Architecte technique retraité
    Secteur : Industrie

    Informations forums :
    Inscription : Juin 2008
    Messages : 21 287
    Points : 36 776
    Points
    36 776
    Par défaut
    Salut,

    Sur la plupart des ordinateurs modernes, les fichiers sont des tableaux d'octets (bytes) i.e. 8 bits.

    Lorsque vous écrivez:
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    write("011")
    write("1101101")
    write("1001")
    Vous écrivez des chaînes de caractères composés des octets correspondants aux codes ASCII de "0" et "1".

    Si vous voulez écrire une suite de bits de longueur variable, il va falloir:
    • ajouter des bits pour que la longueur soit multiple de 8.
    • découper la suite en paquets de 8
    • en faire un tableau de bytes,
    • les écrire...


    - W
    Architectures post-modernes.
    Python sur DVP c'est aussi des FAQs, des cours et tutoriels

  3. #3
    Expert éminent sénior Avatar de disedorgue
    Homme Profil pro
    Ingénieur intégration
    Inscrit en
    Décembre 2012
    Messages
    4 287
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France

    Informations professionnelles :
    Activité : Ingénieur intégration
    Secteur : High Tech - Opérateur de télécommunications

    Informations forums :
    Inscription : Décembre 2012
    Messages : 4 287
    Points : 12 744
    Points
    12 744
    Par défaut
    Bonjour,

    Un petit exemple simple:
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    chaine='101011010010000110010'
    with open("/tmp/yy", "wb") as fd:
        fd.write(bytearray([int(x,2) for x in [chaine[x:x + 8] for x in range(0, len(chaine), 8)]]))
    ce qui donne pour le fichier:
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    $ du -b /tmp/yy 
    3	/tmp/yy
    $ xxd -b /tmp/xx 
    00000000: 10101101 00100001 00010010                             .!.
    La valeur de la chaine en octet est: 10101101 00100001 xxx10010.
    Sur le dernier octet les xxx représentent les zéros en rouge qui sont en fait le padding toujours sur le dernier octet (car on ne peut écrire que des octets entiers dans un fichier).
    Si tu veux que le padding se fasse du coté gauche de la "chaine", il faut donc que tu la remplisse de zero de ce coté gauche pour qu'elle ait un multiple de 8 de caractère et donc, dans l'exemple il faudrait que la chaine ressemble à:
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    chaine='000101011010010000110010'
    Cordialement.

  4. #4
    Expert éminent Avatar de BufferBob
    Profil pro
    responsable R&D vidage de truites
    Inscrit en
    Novembre 2010
    Messages
    3 035
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations professionnelles :
    Activité : responsable R&D vidage de truites

    Informations forums :
    Inscription : Novembre 2010
    Messages : 3 035
    Points : 8 400
    Points
    8 400
    Par défaut
    vu d'ici la grosse difficulté c'est de rajouter (append) des bits au fichier, justement parce qu'on ne sait pas sur quel bit on s'est arrêté précédemment, si on a comme dernier octet dans le fichier la valeur 0, combien de bits à 0 on a écrit au préalable ?
    du coup sans maintenir un index quelque part on ne peut pas garantir l'intégrité des données écrites dans le fichier

    comme dit plus haut ça n'a rien de naturel pour l'ordi d'écrire des séries de bits de longueur aléatoire, la brique de base ça reste l'octet, et ce quelque soit le langage

  5. #5
    Expert éminent sénior Avatar de disedorgue
    Homme Profil pro
    Ingénieur intégration
    Inscrit en
    Décembre 2012
    Messages
    4 287
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France

    Informations professionnelles :
    Activité : Ingénieur intégration
    Secteur : High Tech - Opérateur de télécommunications

    Informations forums :
    Inscription : Décembre 2012
    Messages : 4 287
    Points : 12 744
    Points
    12 744
    Par défaut
    Pour moi, il n'est pas assez explicite dans la finalité de son besoin, car sur des fichiers standards, on est bien sur de l'octet et on doit jouer avec des seek, mais sur un fichier de type device, ça peut dépendre de l'implémentation derrière...
    Cordialement.

  6. #6
    Expert éminent Avatar de BufferBob
    Profil pro
    responsable R&D vidage de truites
    Inscrit en
    Novembre 2010
    Messages
    3 035
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations professionnelles :
    Activité : responsable R&D vidage de truites

    Informations forums :
    Inscription : Novembre 2010
    Messages : 3 035
    Points : 8 400
    Points
    8 400
    Par défaut
    le PO précisait au début :
    Citation Envoyé par Hyssgrif Voir le message
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
     write("011")
     write("1101101")
     write("1001")
    File -> 01111011011001
    comme tu fais remarquer, lors du premier write() il va donc écrire dans le fichier un unique octet de valeur 0x3, et au delà du zéro qui est devant (pb que tu as soulevé) la question c'est aussi comment se positionner correctement lors du second write(), et du troisième, seek() va pas aider beaucoup ici...

  7. #7
    Expert éminent sénior Avatar de disedorgue
    Homme Profil pro
    Ingénieur intégration
    Inscrit en
    Décembre 2012
    Messages
    4 287
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France

    Informations professionnelles :
    Activité : Ingénieur intégration
    Secteur : High Tech - Opérateur de télécommunications

    Informations forums :
    Inscription : Décembre 2012
    Messages : 4 287
    Points : 12 744
    Points
    12 744
    Par défaut
    En fait, ça dépend encore du besoin de l'auteur car comme on peut le voir, les "write" se veulent sous forme binaire mais les exemples suggèrent que chacun ne dépassera pas l'octet dans l'écriture.

    Sinon, ça pourrait être le moment de créer une fonction bseek qui se positionne en bits ou mieux de décorer seek pour qu'il le fasse
    Cordialement.

Discussions similaires

  1. Watermarking fichier son (bits de poids faibles)
    Par lou013 dans le forum Algorithmes et structures de données
    Réponses: 2
    Dernier message: 04/01/2009, 17h37
  2. Lecture bit à bit d'un fichier
    Par luckan dans le forum Débuter
    Réponses: 4
    Dernier message: 07/02/2008, 17h45
  3. Ecrire un fichier image 32 bits
    Par The Niceman dans le forum Images
    Réponses: 15
    Dernier message: 31/01/2008, 21h00
  4. Réponses: 5
    Dernier message: 19/11/2007, 11h22
  5. Réponses: 5
    Dernier message: 03/06/2005, 14h06

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