【问题标题】:Convert float64 to byte array将 float64 转换为字节数组
【发布时间】:2017-09-27 08:22:24
【问题描述】:

如何将 float64 变量转换为大端编码字节数组?

var f float64 = 12.666512
var result []byte = float64ToByte(f);
fmt.Printf("result:%f",result)

为了清楚起见,我应该如何在以下操场中实现float64ToByte 函数?

https://play.golang.org/p/LevxCDd7mK

【问题讨论】:

  • @Flimzy:我编辑了问题(大端)。

标签: go type-conversion


【解决方案1】:

您可以使用 binary.Write() 包中的 "encoding/binary"

func float64ToByte(f float64) []byte {
    var buf bytes.Buffer
    err := binary.Write(&buf, binary.BigEndian, f)
    if err != nil {
        fmt.Println("binary.Write failed:", err)
    }
    return buf.Bytes()
}

https://play.golang.org/p/XcvM5eaGtU

【讨论】:

  • 注:代码是正确的,但大多数计算机使用小端:binary.LittleEndian。
  • @HelinWang 是的,但如果您要插入排序的键值对存储,如 Bolt 或 Badger,则需要大端序。
【解决方案2】:

使用math.Float64bits 获取float64 作为uint64。在uint64 上使用移位和转换来转换为所需的字节序列。例如,这里是如何以大端顺序对浮点数进行编码:

var buf [8]byte
n := math.Float64bits(f)
buf[0] = byte(n >> 56)
buf[1] = byte(n >> 48)
buf[2] = byte(n >> 40)
buf[3] = byte(n >> 32)
buf[4] = byte(n >> 24)
buf[5] = byte(n >> 16)
buf[6] = byte(n >> 8)
buf[7] = byte(n)

您可以使用encoding/binaryuint64 转换为字节,而不是直接写出移位和转换。以下是如何使用该包以大端顺序对float64 进行编码:

var buf [8]byte
binary.BigEndian.PutUint64(buf[:], math.Float64bits(f))

小端代码是:

var buf [8]byte
binary.LittleEndian.PutUint64(buf[:], math.Float64bits(f))

这是问题中float64ToByte 函数的大端实现:

func float64ToByte(f float64) []byte {
   var buf [8]byte
   binary.BigEndian.PutUint64(buf[:], math.Float64bits(f))
   return buf[:]
}

playground example

【讨论】:

  • this anwser 告诉您如何操作,但如果您对为什么将浮点数转换为 uint32 感兴趣,请参阅 IEEE754 标准了解详细信息。
【解决方案3】:

https://play.golang.org/p/FO32EmWfjbL

在我的系统上它必须是小端:

func float64ToByte(f float64) []byte {
    var buf bytes.Buffer
    err := binary.Write(&buf, binary.LittleEndian, f)
    if err != nil {
        fmt.Println("binary.Write failed:", err)
    }
    return buf.Bytes()
}

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 2019-05-21
    • 2014-08-08
    • 1970-01-01
    • 1970-01-01
    • 2019-11-24
    • 1970-01-01
    • 1970-01-01
    • 2011-07-02
    相关资源
    最近更新 更多