2017-06-06 5 views
1

Je suis aux prises avec un problème de format numérique dans Python 3.6. Mon but est de convertir les données binaires d'un fichier en nombres décimaux imprimables. À titre d'exemple, je dois convertir deux octets little-endian sous la forme d'une chaîne d'octets ...Décomptage binaire à point fixe en python

b '\ x12 \ 00'

dans sa forme binaire big-endian ...

et enfin à sa forme nombre décimal 16-bit fixed-point Q15 ...

(1/4096) + (1/16384) = 0.00030517578

Dans mes tentatives infructueuses, la fonction struct.unpack semblait prometteuse, mais mon expérience de représentation de bas niveau/nombre n'est pas très mature pour le moment.

Échec tentative:

struct.unpack('<h', b'\x12\x00') # Yields (18,) 

Le code ci-dessus me fait "18", ce qui serait bien si les octets représentent un nombre entier, mais ils ne le font pas.

Toute aide ou conseil serait apprécié. Je vous remercie!

+1

Les octets représentent un entier qui a été décalé de 15 bits. Diviser par 32768 (2 ** 15) pour obtenir la valeur réelle Q15. (Cela ne correspond pas à la valeur que vous avez calculée, mais c'est parce que vous avez mal fait les maths - les deux bits ont en réalité des valeurs de place de 1/2048 et 1/16384.) – jasonharper

+0

@jasonharper Vous avez raison, belle prise! Votre solution fonctionne, et je crois que je comprends votre approche. Je vous remercie! –

Répondre

1

une réponse en @jasonharper en question comments--

Les octets ne représentent un nombre entier - qui a été décalée de 15 bits. Diviser par 32768 (2 ** 15) pour obtenir la valeur réelle Q15. (Cela ne correspond pas à la valeur calculée, mais c'est parce que vous avez fait le mauvais mathématiques - les deux bits ensemble ont effectivement lieu les valeurs de 1/2048 et 1/16384.)

J'atteint la valeur correcte via le code suivant:

struct.unpack('<h', b'\x12\x00')[0]/(2**15)