Domanda

Come faccio a convertire un float rubino / doppia di alta endian ordine esagonale con alte e basse byte byte.

Esempio:

start with 99.0

finire con

40 58 C0 00   00 00 00 00
high bytes    low bytes
È stato utile?

Soluzione

Bene, come Patrick ha detto , è non ci vuole molto per convertire passato con 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"]

Quindi, dipende se si desidera decomprimere con il byte di ordine alto nell'indice zero o il byte di ordine basso nell'indice di zero:

      E     |  Double-precision float, little-endian byte order
      G     |  Double-precision float, network (big-endian) byte order

Altri suggerimenti

La classe array ha un metodo pacchetto:

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

Questo ti dà una stringa di byte, ma la conversione da quello a esadecimale per la stampa dovrebbe essere banale.

Se si vuole andare nella direzione opposta, la classe String ha un metodo di decompressione:

s.unpack("d")
=>[99.0]
Autorizzato sotto: CC-BY-SA insieme a attribuzione
Non affiliato a StackOverflow
scroll top