我能够将[]字节转换为无符号整数: a := binary.LittleEndian.Uint16(sampleA)b := binary.BigEndian.Uint32(sampleB) 这利用了Go包https://golang.org/src/encoding/binary/binary.go中的BigEndian和LittleEndian类型 这提供了
          a := binary.LittleEndian.Uint16(sampleA) b := binary.BigEndian.Uint32(sampleB)
这利用了Go包https://golang.org/src/encoding/binary/binary.go中的BigEndian和LittleEndian类型
这提供了Uint16()但是没有等效的Int16()或Float32()
有什么想法为什么不?另外,应该怎么做?
将数值类型转换为一系列字节([]字节),反之亦然,大约是 endianness.您如何解释结果完全取决于您.您只需要组合一个16位,32位或64位值,一旦完成,您可以根据需要解释结果.
例如,如果您已经有一个uint16值,要将其用作有符号值,您只需要类型conversion,因为uint16和int16的内存布局相同(从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)
如果您从数学包中查看这些函数的实现,您可以看到内存值/布局没有被操作,它只是通过使用unsafe包被“查看”为不同的类型.例如:
func Float32frombits(b uint32) float32 { return *(*float32)(unsafe.Pointer(&b)) } 
 正如Paul所提到的,二进制包提供了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
