golang:将hex转换为float

Jan*_*Jan 5 floating-point hex type-conversion go

我必须转换hex,表示为strings(例如"0xC40C5253")浮点值(IEEE-754转换).我没有设法使用strconv.ParseFloat函数.还有什么我必须使用的吗?到目前为止我找不到它.我也尝试先将它转换为整数然后转换为浮点数,但结果是错误的.

我上次尝试的代码:

package main

import (
  "fmt"
  "strconv"
)

func main () {
  x, err := strconv.ParseInt("C40C5253", 16, 64) 
  f, err := strconv.ParseFloat(fmt.Sprintf("%d", x), 64) 

  if err != nil {
    fmt.Printf("Error in conversion: %s\n", err)
  } else {
    fmt.Println(f)
  }
}
Run Code Online (Sandbox Code Playgroud)

icz*_*cza 7

首先,需要说明输入的位长。由于十六进制表示形式有4个字节(8个十六进制数字),因此很可能是a float32(需要询问者澄清)。

您可以将十六进制表示形式的字节解析为uint32using strconv.ParseUint()ParseUint()总是返回uint64占用8个字节的内存,因此您必须将其转换为占用uint324个字节的内存,如下所示float32

s := "C40C5253"
n, err := strconv.ParseUint(s, 16, 32)
if err != nil {
    panic(err)
}
n2 = uint32(n)
Run Code Online (Sandbox Code Playgroud)

现在您有了字节,但是它们存储在类型变量中uint32,因此被解释为整数的字节。而且您想将它们解释为IEEE-754浮点数的字节,可以使用unsafe包来做到这一点:

f := *(*float32)(unsafe.Pointer(&n2))
fmt.Println(f)
Run Code Online (Sandbox Code Playgroud)

输出(在Go Playground上尝试):

-561.2863
Run Code Online (Sandbox Code Playgroud)

注意:

正如JimB所指出的那样,对于第二部分(转换uint32float32),math程序包具有内置功能math.Float32frombits(),该功能可以在后台执行此操作:

f := math.Float32frombits(n2)
Run Code Online (Sandbox Code Playgroud)

  • 虽然它使用相同的不安全方法,但是`math'软件包具有类似[Float64FromBits](http://golang.org/pkg/math/#Float64frombits)之类的方法 (3认同)

lnm*_*nmx 6

以下是产生-561.2863的两种不同方法:http://play.golang.org/p/Y60XB820Ib

import (
    "bytes"
    "encoding/binary"
    "encoding/hex"
    "math"
    "strconv"
)

func parse_read(s string) (f float32, err error) {
    b, err := hex.DecodeString(s)

    if err != nil {
        return
    }

    buf := bytes.NewReader(b)

    err = binary.Read(buf, binary.BigEndian, &f)

    return
}

func parse_math(s string) (f float32, err error) {
    i, err := strconv.ParseUint(s, 16, 32)

    if err != nil {
        return
    }

    f = math.Float32frombits(uint32(i))

    return
}
Run Code Online (Sandbox Code Playgroud)