Frage

Wie kann ich eine rubin float / double zu hoch Endian hex mit hohen Byte und Low-Byte konvertieren.

Beispiel:

start with 99.0

am Ende mit

40 58 C0 00   00 00 00 00
high bytes    low bytes
War es hilfreich?

Lösung

Nun, wie Patrick sagte , es nicht viel nehmen Vergangenheit mit Array\#pack zu konvertieren.

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"]

Es hängt also, ob Sie es mit dem High-Byte in dem Null-Index oder das niederwertige Byte im Null-Index entpacken mögen:

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

Andere Tipps

Die Array-Klasse hat eine Packung Methode:

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

Das gibt Ihnen einen Byte-String, aber von der zu hex für den Druck Umwandlung sollte trivial sein.

Wenn Sie in die andere Richtung gehen wollen, die String-Klasse hat eine auspacken Methode:

s.unpack("d")
=>[99.0]
Lizenziert unter: CC-BY-SA mit Zuschreibung
Nicht verbunden mit StackOverflow
scroll top