Cómo convertir un doble a hexadecimal?
Pregunta
¿Cómo convierto un flotador rubí / doble de alta endian hexagonal orden con altas y bajas bytes bytes.
ejemplo:
start with 99.0
terminar con
40 58 C0 00 00 00 00 00
high bytes low bytes
Solución
Bueno, como Patrick dijo , se no tomar mucho para convertir pasado 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"]
Así que depende de si se desea expandir con el byte de orden superior en el índice cero o el byte de orden bajo en el índice cero:
E | Double-precision float, little-endian byte order
G | Double-precision float, network (big-endian) byte order
Otros consejos
La clase matriz tiene un método pack:
a = [99.0]
s = a.pack("d")
s
=> "\000\000\000\000\000\300X@"
Esto le da una cadena de bytes, pero la conversión de aquel al hexagonal para la impresión debe ser trivial.
Si quieres ir a otro lado, la clase string tiene un método de desempaquetado:
s.unpack("d")
=>[99.0]
Licenciado bajo: CC-BY-SA con atribución
No afiliado a StackOverflow