通常用于数据规约解析,例如我们需要将整数和浮点型小数转成16进制字符串后,再转成字节数组数据传递TCP,详细看下面的工具类,
package main
import (
"encoding/binary"
"encoding/hex"
"fmt"
"math"
"strconv"
"unsafe"
)
func main() {
fmt.Println(numToHex(110))
floatHex := floatToHex(15.0)
fmt.Println("hex=" + floatHex)
fmt.Println(hexToFloat32(floatHex))
}
// StringToBytes 字符串转字节数组
func StringToBytes(s string) []byte {
bytes, _ := hex.DecodeString(s)
return bytes
}
// ByteToFloat32 byte字节数组转float32
func ByteToFloat32(bytes []byte) float32 {
bits := binary.LittleEndian.Uint32(bytes)
return math.Float32frombits(bits)
}
// 小端16进制转float32
func hexToFloat32(hex string) float32 {
bytes := StringToBytes(hex)
return ByteToFloat32(bytes)
}
// 需要传入的hex为大端格式
func hexToFloat(hex string) float32 {
s := hex
n, err := strconv.ParseUint(s, 16, 32)
if err != nil {
fmt.Println(err)
}
n2 := uint32(n)
f := *(*float32)(unsafe.Pointer(&n2))
return f
}
// 10进制转2位字节16进制(15为000f)
func numToHex(num int) string {
hex := fmt.Sprintf("%04x", num)
return hex
}
// 浮点型转16进制字符串(小端模式16进制字符串)
func floatToHex(float32 float32) string {
// 浮点型转字节数组
bits := math.Float32bits(float32)
bytes := make([]byte, 4)
binary.LittleEndian.PutUint32(bytes, bits)
// 字节数组转16进制字符串
hex := hex.EncodeToString(bytes)
return hex
}