Каждый раз, когда вы конвертируете двоичный поток байтов во что-то другое, вы обычно используете String#unpack
(и Array#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'
, если на самом деле у вас есть восьмибайтовый дубль, а не четырехбайтовое число с плавающей точкой.