我能够转换[]byte为无符号整数:
a := binary.LittleEndian.Uint16(sampleA)
b := binary.BigEndian.Uint32(sampleB)
Run Code Online (Sandbox Code Playgroud)
这利用了Go包中的BigEndian和LittleEndian类型 https://golang.org/src/encoding/binary/binary.go
但这提供了Uint16()没有等价物Int16()或Float32()
有什么想法为什么不?另外,应该怎么做?
将数字类型转换为一系列字节([]byte),反之亦然,这是关于字节序的.你如何解释结果完全取决于你.
您只需要组合一个16位,32位或64位值,一旦完成,您可以根据需要解释结果.
例如,如果你已经有了一个uint16值,使用它作为一个符号的值,你需要的是一个类型转换,因为的内存布局uint16和int16是相同的(从转换uint16到int16不改变内存中的表示仅仅是类型):
a := binary.LittleEndian.Uint16(sampleA)
// If you need int16:
a2 := int16(a)
Run Code Online (Sandbox Code Playgroud)
同理:
a := binary.LittleEndian.Uint64(sampleA)
// If you need int64:
a2 := int64(a)
Run Code Online (Sandbox Code Playgroud)
使用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)
Run Code Online (Sandbox Code Playgroud)
如果您从math包中查看这些函数的实现,您可以看到内存值/布局没有被操作,只是通过使用unsafe包来"查看"为不同的类型.例如:
func Float32frombits(b uint32) float32 { return *(*float32)(unsafe.Pointer(&b)) }
Run Code Online (Sandbox Code Playgroud)
正如保罗所说,binary包提供Read()和Write()功能做引擎盖下这些转换,所以你并不需要.
展示使用相同的"pi"示例(来自doc 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)
Run Code Online (Sandbox Code Playgroud)
输出(在Go Playground上试试):
3.141592653589793
3.141592653589793
Run Code Online (Sandbox Code Playgroud)
该ByteOrder类型提供了用于解码二进制值的低级 API。要读取 float64 或其他类型,您可以使用binary.Read. godoc 页面上有一个二进制包的示例,我将其复制到此处:
var pi float64
b := []byte{0x18, 0x2d, 0x44, 0x54, 0xfb, 0x21, 0x09, 0x40}
buf := bytes.NewReader(b)
err := binary.Read(buf, binary.LittleEndian, &pi)
if err != nil {
fmt.Println("binary.Read failed:", err)
}
fmt.Print(pi)
Run Code Online (Sandbox Code Playgroud)
没有用于解码 float16 的函数,因为那不是 Go 中的类型。
| 归档时间: |
|
| 查看次数: |
4358 次 |
| 最近记录: |