Как конвертировать двойной в гекс? - PullRequest
5 голосов
/ 08 апреля 2009

Как мне преобразовать рубиновое число с плавающей запятой / двойное число в шестнадцатеричный порядок с старшим байтом и младшим байтом.

Пример:

start with 99.0

заканчивается

40 58 C0 00   00 00 00 00
high bytes    low bytes

Ответы [ 2 ]

6 голосов
/ 08 апреля 2009

Ну, , как сказал Патрик , конвертирование в прошлое с использованием Array\#pack не займет много времени.

irb> [99.0].pack('G').split('').map { |ds| ds[0] }
#=> [64, 88, 192, 0, 0, 0, 0, 0]
irb> _.map { |d| "%02x" % d }
#=> ["40", "58", "c0", "00", "00", "00", "00", "00"]
irb> [99.0].pack('E').split('').map { |ds| ds[0] }
#=> [0, 0, 0, 0, 0, 192, 88, 64]
irb> _.map { |d| "%02x" % d }    
#=> ["00", "00", "00", "00", "00", "c0", "58", "40"]

Так что это зависит от того, хотите ли вы распаковать его с старшим байтом в нулевом индексе или младшим байтом в нулевом индексе:

      E     |  Double-precision float, little-endian byte order
      G     |  Double-precision float, network (big-endian) byte order
0 голосов
/ 08 апреля 2009

В классе массива есть метод pack:

a = [99.0]
s = a.pack("d")
s
=> "\000\000\000\000\000\300X@"

Это дает вам строку байтов, но преобразование из нее в шестнадцатеричное для печати должно быть тривиальным.

Если вы хотите пойти другим путем, у класса string есть метод распаковки:

s.unpack("d")
=>[99.0]
...