我能够将其转换[]byte为无符号整数:
[]byte
a := binary.LittleEndian.Uint16(sampleA) b := binary.BigEndian.Uint32(sampleB)
这利用了Go包https://golang.org/src/encoding/binary/binary.go中的BigEndian和LittleEndian类型。
这提供了,Uint16()但是没有等效项Int16()或Float32()
Uint16()
Int16()
Float32()
有什么想法为什么不呢?另外,应该怎么做呢?
将数字类型转换为一系列字节([]byte),反之亦然,这与字节序有关。您如何解释结果完全取决于您。
您所需要做的就是汇编一个16位,32位或64位值,完成后,您可以根据需要解释结果。
例如,如果您已经有一个uint16值(将其用作带符号的值),那么您所需要做的就是类型转换,因为uint16and 的内存布局int16是相同的(从uint16to 转换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()。
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软件包将其“查看”为不同的类型。例如:
unsafe
func Float32frombits(b uint32) float32 { return *(*float32)(unsafe.Pointer(&b)) }
正如保罗所说,binary包提供Read(),并Write()因此你不需要的功能做的引擎盖下这些转换。
binary
Read()
Write()
使用相同的“ pi”示例进行展示(来自的文档binary.Read()):
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