5

ruby float/double を上位バイトと下位バイトを持つ上位エンディアンの 16 進数に変換するにはどうすればよいですか。

例:

start with 99.0

で終わる

40 58 C0 00   00 00 00 00
high bytes    low bytes
4

3 に答える 3

6

さて、パトリックが言ったように、 を使用して変換するのにそれほど時間はかかりません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"]

したがって、ゼロ インデックスの上位バイトとゼロ インデックスの下位バイトのどちらで展開するかによって異なります。

      E     |  Double-precision float, little-endian byte order
      G     |  Double-precision float, network (big-endian) byte order
于 2009-04-08T01:38:34.867 に答える
0

配列クラスには pack メソッドがあります。

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

これによりバイト文字列が得られますが、印刷のためにそれを16進数に変換するのは簡単です。

逆に行きたい場合は、文字列クラスに unpack メソッドがあります。

s.unpack("d")
=>[99.0]
于 2009-04-08T01:14:15.940 に答える