Como converter um duplo para hexadecimal?
Pergunta
Como faço para converter um float rubi / double de alta hex endian ordem com altos bytes e baixos bytes.
Exemplo:
start with 99.0
acabar com
40 58 C0 00 00 00 00 00
high bytes low bytes
Solução
Bem, como Patrick disse , ele não é preciso muito para converter passado usando 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"]
Por isso, depende se deseja descompactá-lo com o byte de ordem alta no índice zero ou o byte ordem baixa no índice zero:
E | Double-precision float, little-endian byte order
G | Double-precision float, network (big-endian) byte order
Outras dicas
A classe Array tem um método pack:
a = [99.0]
s = a.pack("d")
s
=> "\000\000\000\000\000\300X@"
Isto dá-lhe uma cadeia de bytes, mas a conversão de que a hex para impressão deve ser trivial.
Se você quer ir para o outro lado, a classe String tem um método de descompactação:
s.unpack("d")
=>[99.0]
Licenciado em: CC-BY-SA com atribuição
Não afiliado a StackOverflow