将float64转换为字节数组

Moh*_*sen 4 type-conversion go

如何将float64变量转换为big endian编码的字节数组?

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

为了清楚起见,我应该如何float64ToByte在以下游乐场中实现功能?

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

Cer*_*món 7

使用math.Float64bits得到float64uint64.使用移位和转换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)
Run Code Online (Sandbox Code Playgroud)

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

var buf [8]byte
binary.BigEndian.PutUint64(buf[:], math.Float64bits(f))
Run Code Online (Sandbox Code Playgroud)

小端代码是:

var buf [8]byte
binary.LittleEndian.PutUint64(buf[:], math.Float64bits(f))
Run Code Online (Sandbox Code Playgroud)

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

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

操场的例子


har*_*r07 5

您可以binary.Write()从package中使用"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()
}
Run Code Online (Sandbox Code Playgroud)

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

  • @HelinWang 是的,但是如果您要插入排序的键值存储,例如 Bolt 或 Badger,则需要大端。 (4认同)
  • 注意:代码是正确的,但大多数计算机使用小端:binary.LittleEndian。 (2认同)