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 :

Manipulations binaires : savoir si un bit est "set"


Sujet :

Python

  1. #1
    Membre habitué

    Profil pro
    Inscrit en
    Décembre 2004
    Messages
    121
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Décembre 2004
    Messages : 121
    Points : 127
    Points
    127
    Par défaut Manipulations binaires : savoir si un bit est "set"
    Salut,

    Je suis entrain de faire une ptite classe qui ouvre, parse et affiche un fichier bitmap et j'en suis aux images monochromes et je crois que j'ai un probleme au niveau de la detection des bits, savoir s'il sont "set" ou "clear". Deja j'aimerais bien quelques explications sur ces termes :p. Et comment on fait pour le savoir lol ^^. De mes recherches j'ai tiré qqch avec ord et le signe & suivi de d'un nombre bizard. J'en ai fait ça :
    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
    x=0
                y=self.size[1]-1
                i=0
                tab=[0x10, 0x20, 0x30, 0x40, 0x50, 0x60, 0x70, 0x80]
                while 1:
                    a=f.read(1)
                    i+=1
                    for j in range(8):
                        bit=ord(a) & tab[j] ###vala ici
                        #print ord(a)
                        if(int(bit)!=0): self.Pixels[x][y]=colors[1]
                        else: self.Pixels[x][y]=colors[0]
                        x+=1
                        if(x==self.size[0]):
                            x=0
                            y-=1
                            if(i%4!=0): f.read(4-(i%4)) #un ligne a tjrs une longueur multiple de 4
                            i=0
                        if(y<0) : break
                    if(y<0) : break
    Donc ça fonctionne quand l'image est pas compliqué (genre une moitié blanche, l'autre noire) mais des que ça se complique (cad des traits un peu ds tt les sens) ça fé un peu nimporte nawak, dc je me suis dit que ça venais de la detection des bits clear ou set ^^.

    Merci d'avance

  2. #2
    Membre habitué

    Profil pro
    Inscrit en
    Décembre 2004
    Messages
    121
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Décembre 2004
    Messages : 121
    Points : 127
    Points
    127
    Par défaut
    Je vien de trouver ça :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    a=s.unpack('B', f.read(1))[0]
                    i+=1
                    for j in range(8):
                        bit=(a>>j)&1
    qui ne me donne tjrs pas le resultat correct... mais si ça sen rapproche plus

    Rien de ce que je trouve qui est sensé lire tel bit de loctet ne marche !!............. :'(

  3. #3
    Membre habitué

    Profil pro
    Inscrit en
    Décembre 2004
    Messages
    121
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Décembre 2004
    Messages : 121
    Points : 127
    Points
    127
    Par défaut
    Victoire j'ai enfin reussi, pour ceux qui en aurait eventuellement besoin un jour, voilà comment j'ai fait :
    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
                x=0 
                y=self.size[1]-1 
                i=0
                while 1: 
                    a=f.read(1) 
                    i+=1 
                    for j in range(8): 
                        bit=ord(a) & (0x80>>j)
                        if(int(bit)!=0): self.Pixels[x][y]=colors[1] 
                        else: self.Pixels[x][y]=colors[0] 
                        x+=1 
                        if(x==self.size[0]): 
                            x=0 
                            y-=1 
                            if(i%4!=0): f.read(4-(i%4)) #un ligne a tjrs une longueur multiple de 4 
                            i=0 
                        if(y<0) : break 
                    if(y<0) : break

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

Discussions similaires

  1. Réponses: 6
    Dernier message: 22/11/2012, 11h35
  2. Savoir si une dll est 32 ou 64 bits
    Par uriotcea dans le forum Débuter
    Réponses: 18
    Dernier message: 28/07/2011, 12h37
  3. savoir si un fichier est texte ou binaire
    Par khayyam90 dans le forum Langage
    Réponses: 6
    Dernier message: 29/08/2010, 15h08

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