2015-01-28 2 views
1

Я пытаюсь преобразовать набор из 2 16-разрядных целых чисел в одно 32-битное число с плавающей запятой. Это для моей работы по протоколу связи MODBUS. Мой запрос - то же самое, что указано herePython: Convert 2 ints to float

Однако, когда я следую подходу pack/unpack, предоставленному там, я не получаю подобных результатов.

Вот моя тестовая программа:

from struct import * 

tup=(16256, 0) 

print hex(tup[0]) 
print hex(tup[1]) 

mypack = pack('>HH',tup[0],tup[1]) 
print mypack 

f = unpack('f', mypack)[0] 
print f 

И выход, как показано ниже:

0x3f80 
0x0 
? 
4.60060298822e-41 

Я ожидаю, что конечный результат будет на самом деле просто «1,0», как точка интерпретации плавающего " 0x3F800000 'это просто!

Я запускаю этот код на доске Beagle Bone Black с операционной системой Debian.

Куда я иду не так?

ответ

5

Вам нужно указать континент в своем распакованном вызове.

from struct import * 

tup=(16256, 0) 

print hex(tup[0]) 
print hex(tup[1]) 

mypack = pack('>HH',tup[0],tup[1]) 
print `mypack` 

f = unpack('>f', mypack) 
print f 

выход

0x3f80 
0x0 
'?\x80\x00\x00' 
(1.0,) 

Но имейте в виду предупреждения/предостережения, упомянутые в этом вопросе вы связаны, особенно в отношении NaN.

Также обратите внимание, что обычно считается неправильной практикой from modulename import *, потому что она сбрасывает имена с modulename в пространство имен ваших скриптов. Это грязно, и это может привести к ошибкам. Так что лучше делать

import struct 

#... 

mypack = struct.pack('>HH',tup[0],tup[1]) 
f = struct.unpack('>f', mypack) 

Конечно, это немного больше, чтобы напечатать, но это делает код намного проще читать и поддерживать.