如何将 float64 变量转换为大端编码字节数组?
var f float64 = 12.666512
var result []byte = float64ToByte(f);
fmt.Printf("result:%f",result)
为了清楚起见,我应该如何在下面的 Playground 中实现
float64ToByte
功能?
使用 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[:]
}
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/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()
}
为这个问题增添了另一种风味。
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]))
}