Question

Comment convertir un flotteur rubis / double pour haute hex ordre endian avec de hauts et bas octets octets.

Exemple:

start with 99.0

finissent par

40 58 C0 00   00 00 00 00
high bytes    low bytes
Était-ce utile?

La solution

Eh bien, comme Patrick dit , il ne prend pas beaucoup pour convertir passé en utilisant 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"]

Donc, cela dépend si vous voulez le décompresser avec l'octet de poids fort dans l'indice zéro ou l'octet de poids faible dans l'indice zéro:

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

Autres conseils

La classe de réseau dispose d'une méthode pour le pack:

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

Cela vous donne une chaîne d'octets, mais la conversion de celui hex pour l'impression doit être trivial.

Si vous voulez aller dans l'autre sens, la classe chaîne a une méthode Déballez:

s.unpack("d")
=>[99.0]
Licencié sous: CC-BY-SA avec attribution
Non affilié à StackOverflow
scroll top