将 float64 转换为字节数组

问题描述 投票:0回答:4

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

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

为了清楚起见,我应该如何在下面的 Playground 中实现

float64ToByte
功能?

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

go type-conversion
4个回答
23
投票

使用 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/binary

uint64
转换为字节,而不是直接写出移位和转换。以下是如何使用该包以大端顺序对
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[:]
}

游乐场示例


11
投票

您可以使用包装中的

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


0
投票

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()
}

0
投票

为这个问题增添了另一种风味。

func float64ToBytes(f64 float64) []byte {
    bts := make([]byte, 8)
    (*(*[]float64)(unsafe.Pointer(&bts)))[0] = f64
    return bts
}

func bytesToF64(bts []byte) float64 {
    return *(*float64)(unsafe.Pointer(&bts[0]))
}
© www.soinside.com 2019 - 2024. All rights reserved.