-
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.
-
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 */
-
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
-
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