如何将 Ruby 的浮点数转换为高位优先的十六进制,高字节在前,低字节在后。
示例:
start with 99.0
最终导致
40 58 C0 00 00 00 00 00
high bytes low bytes
好的,就像Patrick所说的那样,将过去使用的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
数组类有一个pack方法:
a = [99.0]
s = a.pack("d")
s
=> "\000\000\000\000\000\300X@"
这将给你一个字节字符串,但将其转换为十六进制以进行打印应该很容易。
如果你想要反过来,字符串类有一个解包方法:
s.unpack("d")
=>[99.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"]