我必须将hex,以strings 表示(例如"0xC40C5253")转换为浮点值( IEEE-754 转换)。我没有使用strconv.ParseFloat函数做到这一点。还有什么我要用的吗?到目前为止我找不到。我也尝试先将其转换为整数,然后转换为浮点数,但结果是错误的。
hex
string
"0xC40C5253"
我最后一次尝试的代码:
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) } }
首先,需要说明输入的位长。由于十六进制表示形式有4个字节(8个十六进制数字),因此很可能是a float32(需要询问者澄清)。
float32
您可以将十六进制表示形式的字节解析为uint32using strconv.ParseUint()。ParseUint()总是返回uint64占用8个字节的内存,因此您必须将其转换为占用uint324个字节的内存,如下所示float32:
uint32
strconv.ParseUint()
ParseUint()
uint64
s := "C40C5253" n, err := strconv.ParseUint(s, 16, 32) if err != nil { panic(err) } n2 = uint32(n)
现在您有了字节,但是它们存储在类型的变量中uint32,因此被解释为整数的字节。而且您想将它们解释为IEEE-754浮点数的字节,可以使用该unsafe包来做到这一点:
unsafe
f := *(*float32)(unsafe.Pointer(&n2)) fmt.Println(f)
输出(在Go Playground上尝试):
-561.2863
注意:
正如JimB所指出的那样,对于第二部分(转换uint32为float32),math程序包具有内置功能math.Float32frombits(),该功能可以在后台执行此操作:
math
math.Float32frombits()
f := math.Float32frombits(n2)