gpt4 book ai didi

将 []byte 转为 Little/Big-Endian 有符号整数或 float ?

转载 作者:IT王子 更新时间:2023-10-29 00:53:55 27 4
gpt4 key购买 nike

我能够将 []byte 转换为无符号整数:

a := binary.LittleEndian.Uint16(sampleA)
b := binary.BigEndian.Uint32(sampleB)

这利用了 Go 包中的 BigEndian 和 LittleEndian 类型 https://golang.org/src/encoding/binary/binary.go .

这提供了 Uint16() 但是没有等效的 Int16()Float32()

为什么不呢?另外,这应该如何完成?

最佳答案

将数字类型转换为一系列字节 ([]byte),反之亦然是关于 endianness 的。 .您如何解释结果完全取决于您。

您只需组装一个 16 位、32 位或 64 位值,完成后,您可以根据需要解释结果。

例如,如果您已经有一个 uint16 值,要将其用作有符号值,您只需要一个类型 conversion因为 uint16int16 的内存布局相同(从 uint16 转换为 int16 不会改变内存表示只是类型):

a := binary.LittleEndian.Uint16(sampleA)
// If you need int16:
a2 := int16(a)

类似地:

a := binary.LittleEndian.Uint64(sampleA)
// If you need int64:
a2 := int64(a)

使用 uint -> float 转换的情况稍微复杂一些,因为使用简单的类型转换会尝试转换数值,而不仅仅是更改类型(因此会更改内存表示)。

要将无符号整数转换为浮点类型,您可以使用 math 的函数包,即math.Float32frombits()math.Float64frombits() ,并且对于具有相同内存布局的反向(将浮点值转换为无符号整数):math.Float32bits()math.Float64bits() .

例如:

a := binary.LittleEndian.Uint64(sampleA)
// If you need a float64:
a2 := math.Float64frombits(a)

如果你从 math 包中查看这些函数的实现,你会发现内存值/布局没有被操纵,它只是被“视为”不同的类型,通过使用 unsafe包裹。例如:

func Float32frombits(b uint32) float32 { return *(*float32)(unsafe.Pointer(&b)) }

正如 Paul 所提到的,binary 包提供了 Read()Write()函数在后台进行这些转换,因此您不需要这样做。

使用相同的“pi”示例展示(来自 binary.Read() 的文档):

b := []byte{0x18, 0x2d, 0x44, 0x54, 0xfb, 0x21, 0x09, 0x40}

// USING binary.Read()
var pi float64
buf := bytes.NewReader(b)
err := binary.Read(buf, binary.LittleEndian, &pi)
if err != nil {
fmt.Println("binary.Read failed:", err)
}
fmt.Println(pi)

// Using LittleEndian.Uint64() and math.Float64frombits()
a := binary.LittleEndian.Uint64(b)
a2 := math.Float64frombits(a)
fmt.Println(a2)

输出(在 Go Playground 上尝试):

3.141592653589793
3.141592653589793

关于将 []byte 转为 Little/Big-Endian 有符号整数或 float ?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/34701187/

27 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com