Как напечатать шестнадцатеричное число, представляющее число с плавающей точкой IEEE 754, как число с плавающей точкой в ​​ruby - PullRequest
2 голосов
/ 16 февраля 2020

Я использую ruby для анализа потока данных, некоторые части которого являются плавающими IEEE-754, но я не уверен, как распечатать их как плавающие. Например:

f = 0xbe80fd31 # -0.2519317
puts "%f" % f
3196124465.000000

как мне получить -0.2519317?

1 Ответ

3 голосов
/ 16 февраля 2020

Каждый раз, когда вы конвертируете двоичный поток байтов во что-то другое, вы обычно используете String#unpackArray#pack, если идете другим путем).

Если у вас есть эти байты :

bytes = [0xbe, 0x80, 0xfd, 0x31]

, вы можете сказать:

bytes.map(&:chr).join.unpack('g')
# [-0.25193169713020325]

и затем развернуть массив. Это:

bytes.map(&:chr).join

упаковывает байты в строку:

"\xbe\x80\xfd\x31"

, которая подходит для #unpack. Вы также можете (спасибо Стефан ) сказать:

# Variations on getting the bytes into a string for `#unpack`
bytes.pack('C4').unpack('g').first
[0xbe80fd31].pack('L>').unpack('g').first

# Variations using `#unpack1`
bytes.map(&:chr).join.unpack1('g')
bytes.pack('C4').unpack1('g')
[0xbe80fd31].pack('L>').unpack1('g')

Если у вас уже есть строка, то вы go можете прямиком набрать #unpack или #unpack1.

Вы захотите использовать 'e' вместо 'g', если ваши байты находятся в другом порядке, и 'E' или 'G', если на самом деле у вас есть восьмибайтовый дубль, а не четырехбайтовое число с плавающей точкой.

...