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 :

Microsoft Basic floating point format


Sujet :

Python

  1. #1
    Membre averti
    Profil pro
    Inscrit en
    Août 2004
    Messages
    38
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Août 2004
    Messages : 38
    Par défaut Microsoft Binary format
    Bonjour,

    Je voudrais convertir des données du format MBF (microsoft binary format), ancien format utilisé par microsoft, au format standard IEEE.

    j'ai trouvé une file de discussion sur le sujet :
    http://www.developpez.net/forums/arc.../t-211104.html

    mais je n'arrive pas à le transposer en python.

    merci pour votre aide.

  2. #2
    Membre averti
    Profil pro
    Inscrit en
    Août 2004
    Messages
    38
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Août 2004
    Messages : 38
    Par défaut formats
    /* MS Binary Format */
    /* byte order => m3 | m2 | m1 | exponent */
    /* m1 is most significant byte => sbbb|bbbb */
    /* m3 is the least significant byte */
    /* m = mantissa byte */
    /* s = sign bit */
    /* b = bit */
    sign = msbin[2] & 0x80; /* 1000|0000b */


    Et le format standard ieee :
    /* IEEE Single Precision Float Format */
    /* m3 m2 m1 exponent */
    /* mmmm|mmmm mmmm|mmmm emmm|mmmm seee|eeee */
    /* s = sign bit */
    /* e = exponent bit */
    /* m = mantissa bit */

  3. #3
    Membre émérite

    Profil pro
    Inscrit en
    Août 2004
    Messages
    723
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Août 2004
    Messages : 723
    Par défaut
    Tu prends les 3 octets de mantisse (en masquant le premier bit du poids fort), puis tu multiplies par 2^exposant, finalement tu isoles le bit de signe et tu prends l'opposé si nécessaire, après il te suffit d'utiliser struct pour convertir en float IEEE

  4. #4
    Membre averti
    Profil pro
    Inscrit en
    Août 2004
    Messages
    38
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Août 2004
    Messages : 38
    Par défaut
    Merci,

    je rencontre des problèmes dans la compréhension de la manipulations des bits.
    j'ai regardé le lien suivant :
    http://docs.python.org/lib/bitstring-ops.html
    mais ça reste très obscure pour moi.

    si je prends un exemple concret avec comme sequence d'interet ('P\xad\x02\x95'), je n'obtiens déjà pas la bonne valeur avant le repackage vers format IEEE.


    >>> from struct import *
    >>> x = list(unpack('BBBB','P\xad\x02\x95'))
    >>> x
    [80, 173, 2, 149]
    >>> def conversion1(bytes):
    b=bytes[:]
    sign = bytes[-2] & 0x80
    b[-2] |= 0x80
    exp = bytes[-1] - 0x80 - 56
    acc = 0L
    for i,byte in enumerate(b[:-1]):
    acc |= (long(byte)<<(i*8))
    return (float(acc)*2.0**exp)*((1.,-1.)[sign!=0])

    >>> conversion1(x)
    0.00024924660101532936

Discussions similaires

  1. Réponses: 1
    Dernier message: 01/06/2007, 10h48
  2. Invalid floating point operation
    Par declencher dans le forum Langage
    Réponses: 5
    Dernier message: 30/10/2005, 23h46
  3. [Struts] validation d'un float au format français
    Par mister_ouille dans le forum Struts 1
    Réponses: 3
    Dernier message: 17/10/2005, 09h56

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