5

如何将 ruby​​ float/double 转换为高字节和低字节的高端十六进制。

例子:

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

数组类有一个打包方法:

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

这为您提供了一个字节字符串,但将其转换为十六进制以进行打印应该是微不足道的。

如果你想反其道而行之,string 类有一个 unpack 方法:

s.unpack("d")
=>[99.0]
于 2009-04-08T01:14:15.940 回答
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"]
于 2020-10-30T08:39:16.293 回答