将字节数组"[] uint8"转换为GoLang中的float64

use*_*186 23 arrays go uint8t

我正在尝试将一个[]uint8字节数组转换为一个float64GoLang.我无法在线找到此问题的解决方案.我已经看到过首先转换为字符串然后转换为a的建议float64但是这似乎不起作用,它失去了它的价值而我最终得到了零.

例:

metric.Value, _ = strconv.ParseFloat(string(column.Value), 64)
Run Code Online (Sandbox Code Playgroud)

它不起作用......

pet*_*rSO 48

例如,

package main

import (
    "encoding/binary"
    "fmt"
    "math"
)

func Float64frombytes(bytes []byte) float64 {
    bits := binary.LittleEndian.Uint64(bytes)
    float := math.Float64frombits(bits)
    return float
}

func Float64bytes(float float64) []byte {
    bits := math.Float64bits(float)
    bytes := make([]byte, 8)
    binary.LittleEndian.PutUint64(bytes, bits)
    return bytes
}

func main() {
    bytes := Float64bytes(math.Pi)
    fmt.Println(bytes)
    float := Float64frombytes(bytes)
    fmt.Println(float)
}
Run Code Online (Sandbox Code Playgroud)

输出:

[24 45 68 84 251 33 9 64]
3.141592653589793
Run Code Online (Sandbox Code Playgroud)

  • 如今,小端几乎是普遍存在的。即使是现代网络协议也使用它(这是有道理的 - 几乎所有处理器都是小端的,所以你只会毫无意义地交换两端的字节)。 (2认同)

Klu*_*uyg 6

我认为 Go 文档中的这个例子就是你要找的:http : //golang.org/pkg/encoding/binary/#example_Read

var pi float64
b := []byte{0x18, 0x2d, 0x44, 0x54, 0xfb, 0x21, 0x09, 0x40}
buf := bytes.NewReader(b)
err := binary.Read(buf, binary.LittleEndian, &pi)
if err != nil {
  fmt.Println("binary.Read failed:", err)
}
fmt.Print(pi)
Run Code Online (Sandbox Code Playgroud)

打印 3.141592653589793


ANi*_*sus 6

正如评论所读,这完全取决于您在[]uint8切片中拥有的数据类型。

如果它是以 Little Endian 顺序表示 IEEE 754 浮点值的字节,则使用 Kluyg 或 peterSo(不使用反射的更好性能)答案。

如果它是用 Latin-1/UTF-8 编码的文本表示,那么你应该能够做你刚刚做的事情:

package main

import (
    "fmt"
    "strconv"
)

func main() {
    var f float64
    text := []uint8("1.23") // A decimal value represented as Latin-1 text

    f, err := strconv.ParseFloat(string(text), 64)
    if err != nil {
        panic(err)
    }

    fmt.Println(f)
}
Run Code Online (Sandbox Code Playgroud)

结果:

1.23

游乐场:http : //play.golang.org/p/-7iKRDG_ZM