淘先锋技术网

首页 1 2 3 4 5 6 7

通常用于数据规约解析,例如我们需要将整数和浮点型小数转成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
}