如何将具有高字节和低字节的ruby float / double转换为高端序十六进制。
实施例
start with 99.0
结束
40 58 C0 00 00 00 00 00
high bytes low bytes
答案 0 :(得分:6)
好吧,like Patrick said,使用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
答案 1 :(得分:0)
数组类有一个pack方法:
a = [99.0]
s = a.pack("d")
s
=> "\000\000\000\000\000\300X@"
这为您提供了一个字节字符串,但是从那里转换为十六进制用于打印应该是微不足道的。
如果你想走另一条路,字符串类有一个解包方法:
s.unpack("d")
=>[99.0]
答案 2 :(得分:0)
对于Ruby 2.x:
pry(main)> [99.0].pack('E').split('')
=> ["\x00", "\x00", "\x00", "\x00", "\x00", "\xC0", "X", "@"]
pry(main)> _.map { |ds| ds.unpack("H*").first }
=> ["00", "00", "00", "00", "00", "c0", "58", "40"]