将 []byte 中存储的二进制数据转换为数字类型,例如有符号整数或浮点数 -点数需要了解字节顺序。 endianness 定义了字节在内存中存储的顺序,常见的格式有两种:little-endian(最低有效字节在前)和 big-endian(最高有效字节在前)。
虽然 Go 二进制包提供了像 LittleEndian.Uint16() 这样用于将 []byte 转换为无符号整数的函数,有符号整数 (Int16()) 没有直接等价的函数。这是因为字节顺序仅影响数据的解释,而不影响其在内存中的实际表示。
要将无符号整数转换为有符号整数,简单的类型转换就足够了,因为它们共享相同的内存布局。例如:
<code class="go">a := binary.LittleEndian.Uint16(sampleA) a2 := int16(a)</code>
同样,您可以使用数学包函数 Float32frombits() 和 Float64frombits() 将无符号整数转换为浮点数。
<code class="go">a := binary.LittleEndian.Uint64(sampleA) a2 := math.Float64frombits(a)</code>
二进制包还提供了 Read() 和 Write() 函数,可以在后台执行这些转换。
<code class="go">import "bytes" b := []byte{0x18, 0x2d, 0x44, 0x54, 0xfb, 0x21, 0x09, 0x40} buf := bytes.NewReader(b) var pi float64 err := binary.Read(buf, binary.LittleEndian, &pi) if err != nil { fmt.Println("binary.Read failed:", err) } fmt.Println(pi) // Using Read() produces the same result as using Uint64() and Float64frombits(): a := binary.LittleEndian.Uint64(b) a2 := math.Float64frombits(a) fmt.Println(a2) // Output: // 3.141592653589793 // 3.141592653589793</code>
以上是如何将 Go []byte 转换为 Little/Big-Endian 有符号整数或浮点数?的详细内容。更多信息请关注PHP中文网其他相关文章!