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 :

Date codé en binaire


Sujet :

Python

  1. #1
    Membre habitué
    Inscrit en
    Avril 2010
    Messages
    313
    Détails du profil
    Informations forums :
    Inscription : Avril 2010
    Messages : 313
    Points : 176
    Points
    176
    Par défaut Date codé en binaire
    Bonjour à tous,
    Je cherche à lire dans un fichier binaire en python. J'ai trouvé comment faire et j'arrive à obtenir mes données (réel, intègre,chaine de caractère)mais je butte sur une date et je ne comprends pas comment elle est codée :
    En hexadecimal, elle est codée : 3F010000 C2C41B5C ce qui doit donner 19/6/2013 13:04:51.138S. Je ne sais pas si les date et heure sont codées ensemble ou pas.
    Avez vous une idée pour décoder ce code et obtenir cette date?

    Merci d'avance

    Fred

  2. #2
    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
    salut,

    Citation Envoyé par amelyfred Voir le message
    En hexadecimal, elle est codée : 3F010000 C2C41B5C ce qui doit donner 19/6/2013 13:04:51.138S.
    en fait je soupçonne que l'hexa que tu donnes est une "vue" de ton éditeur qui affiche les octets groupés par 4 (32bits), c'est l'espace entre les deux dword qui le laisse sous-entendre
    du coup en mémoire on a concrètement les octets seraient plutôt dans cet ordre là 0000013F5C1BC4C2, un coup de struct.unpack() suffit ensuite à récupérer le timestamp :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    >>> import struct, time
    >>> octets = '\x00\x00\x01\x3F\x5c\x1b\xc4\xc2'
    >>> timestamp = struct.unpack('>Q', octets)[0] / 1000
    >>> millisecondes = struct.unpack('>Q', octets)[0] % 1000
    >>> time.localtime(timestamp)
    time.struct_time(tm_year=2013, tm_mon=6, tm_mday=19, tm_hour=13, tm_min=4, tm_sec=51, tm_wday=2, tm_yday=170, tm_isdst=1)
    >>> millisecondes
    138L

  3. #3
    Membre habitué
    Inscrit en
    Avril 2010
    Messages
    313
    Détails du profil
    Informations forums :
    Inscription : Avril 2010
    Messages : 313
    Points : 176
    Points
    176
    Par défaut
    Salut BufferBob,
    Merci OK ça marche avec ton code mais avec mon fichier data ça ne marche pas.

    Voici le fichier. data.py (j'ai ajoute l'extension .py pour pouvoir mettre la pièce jointe) La date est codée sur les 8 premiers octets

    Voici le code :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    import struct
    import time
    f = open("data","rb")
    record = f.read(8)
    timestamp = struct.unpack('<Q', record)[0] / 1000
    millisecondes = struct.unpack('<Q',record)[0] % 1000
    date = time.localtime(timestamp)
    print(timestamp)
    print(date)
    print(millisecondes)[ATTACH]186674[/ATTACH]

  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
    au temps pour moi, tes données étaient pas inversées

    une (la ?) solution consiste à extraire 2 dword (4 octets) et à les inverser pour retomber sur nos pieds, on les repack, et on les unpack comme il faut :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    >>> with open('data', 'rb') as f:
    ...   timestamp = struct.unpack('>Q', struct.pack('<LL', *struct.unpack('>LL', f.read(8))))[0]
    ...
    >>> time.localtime(timestamp / 1000)
    time.struct_time(tm_year=2013, tm_mon=6, tm_mday=19, tm_hour=13, tm_min=4, tm_sec=51, tm_wday=2, tm_yday=170, tm_isdst=1)
    >>> timestamp % 1000
    138L
    edit: soit pour reprendre ton code précédent, peut-être plus lisible :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    import struct, time
    f = open("data","rb")
    record = f.read(8)
    t1 = struct.unpack('>LL', record)
    t2 = struct.pack('<LL', *t1)
    timestamp = struct.unpack('<Q', t2)[0] / 1000
    millisecondes = struct.unpack('<Q',record)[0] % 1000
    date = time.localtime(timestamp)
    print(timestamp)
    print(date)
    print(millisecondes)

  5. #5
    Membre habitué
    Inscrit en
    Avril 2010
    Messages
    313
    Détails du profil
    Informations forums :
    Inscription : Avril 2010
    Messages : 313
    Points : 176
    Points
    176
    Par défaut
    Salut
    Parfait merci beaucoup pour ton aide
    Fred

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

Discussions similaires

  1. Réponses: 3
    Dernier message: 09/02/2009, 18h46
  2. Decimal en decimal codé binaire
    Par dev_gahie dans le forum Général Java
    Réponses: 2
    Dernier message: 24/01/2009, 12h24
  3. Comment récupérer un nombre codé en binaire
    Par amamisou dans le forum Delphi
    Réponses: 28
    Dernier message: 25/06/2007, 15h31
  4. Réponses: 3
    Dernier message: 06/05/2002, 19h24
  5. Réponses: 3
    Dernier message: 19/04/2002, 01h11

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