Hexadécimal de flotter python
-
12-12-2019 - |
Question
Je lis les données d'un fichier binaire.J'ai un document qui me permet de savoir comment l'information est stockée.Pour être sûr de cela, j'utilise XVI32.
J'avais l'extraction de la chaîne d'informations et des données INT correctement, jusqu'à ce que je heurte un type de données de flotteur.
Selon ce fichier:
00800000 = 0.0
7AFBDD35 = 0.061087
9BF7783C = -0.003491
00FBFCAD = 0.031416
J'ai essayé de résoudre ceci avec:
struct.unpack('!f', my_float.decode('hex'))[0]
et d'autres façons différentes ....
J'ai testé ces informations avec des outils en ligne tels que: http://babbage.cs.qc.cuny.edu/eeeee-754/index.xhtml et http://www.binaireconvert.com/result_float.html? décimal= 048046048054049046048054049048056055 , mais toutes ces voies me jette une valeur différente en fonction des résultats d'origine.
Je commence à soupçonner que les informations de flotteur sont cryptées ou quelque chose comme ça, mais pourquoi la chaîne et INT n'étaient pas cryptés?
La solution
puzzle intéressant.Travailler avec la documentation que j'ai proposée:
def byteswap(x):
return ((x & 0x00ff00ff) << 8) | ((x & 0xff00ff00) >> 8)
def tms320_float(raw):
s = (raw >> 23) & 1
mantissa = (raw & 0x007fffff)
exponent = raw >> 24
if exponent >= 128:
exponent -= 256
if exponent == -128:
return 0.0
return (((-2) ** s) + float(mantissa) / float(1 << 23)) * (2.0 ** exponent)
>>> tms320_float(byteswap(0x00800000))
0.0
>>> tms320_float(byteswap(0x7AFBDD35))
0.06108652427792549
>>> tms320_float(byteswap(0x9BF7783C))
-0.003490658476948738
>>> tms320_float(byteswap(0x00FBFCAD))
0.031415924429893494
Autres conseils
Mon patron m'a envoyé la réponse, les données de point flottant ne sont pas au format IEEE.
Le type de données est le point flottant TMS320
Pour une raison quelconque, les valeurs réelles des données hexagonales sont mélangées chaque 2 octets, je veux dire:
80000000 = 0.0
FB7A35DD = 0.061087
F79B3C78 = -0.003491
FB00ADFC = 0.031416
Merci pour soutenir les gars