代码之家  ›  专栏  ›  技术社区  ›  Allyn

如何将双精度转换为十六进制?

  •  5
  • Allyn  · 技术社区  · 15 年前

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

    例子:

    start with 99.0
    

    以结束

    40 58 C0 00   00 00 00 00
    high bytes    low bytes
    
    2 回复  |  直到 15 年前
        1
  •  6
  •   Community Lee Campbell    7 年前

    好, 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
    
        2
  •  0
  •   Patrick    15 年前

    数组类具有pack方法:

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

    这为您提供了一个字节字符串,但将其转换为十六进制进行打印应该是很简单的。

    如果您想换一种方式,string类有一个unpack方法:

    s.unpack("d")
    =>[99.0]