我有一个字节数据流,我想从四个字节得到一个小的endian编码的int32。有比像下面的代码这样做更好的方法吗?
package main
func read_int32(data []byte) int32 {
return int32(uint32(data[0]) + uint32(data[1])<<8 + uint32(data[2])<<16 + uint32(data[3])<<24)
}
func main() {
println(read_int32([]byte{0xFE,0xFF,0xFF,0xFF})) // -2
println(read_int32([]byte{0xFF,0x00,0x00,0x00})) // 255
}上面的代码似乎工作得很好,但可能有一个内置的函数,我已经错过了,或者有一个超级酷的黑客可以在一条指令中做到这一点?
发布于 2012-11-03 02:04:21
encoding/binary包可能有您需要的东西。检查这个:http://golang.org/pkg/encoding/binary/#example_朗读
使用修改后的read_int32函数的代码可以是:
package main
import (
"bytes"
"encoding/binary"
"fmt"
)
func read_int32(data []byte) (ret int32) {
buf := bytes.NewBuffer(data)
binary.Read(buf, binary.LittleEndian, &ret)
return
}
func main() {
fmt.Println(read_int32([]byte{0xFE, 0xFF, 0xFF, 0xFF})) // -2
fmt.Println(read_int32([]byte{0xFF, 0x00, 0x00, 0x00})) // 255
}此外,您还可以通过用binary.LittleEndian替换binary.BigEndian来解释大端
发布于 2014-08-15 17:10:18
这是一个很晚的答案,但是有两种不同的方法。
func readInt32(b []byte) int32 {
// equivalnt of return int32(binary.LittleEndian.Uint32(b))
return int32(uint32(b[0]) | uint32(b[1])<<8 | uint32(b[2])<<16 | uint32(b[3])<<24)
}
// this is much faster and more efficient, however it won't work on appengine
// since it doesn't have the unsafe package.
// Also this would blow up silently if len(b) < 4.
func ReadInt32Unsafe(b []byte) int32 {
return *(*int32)(unsafe.Pointer(&b[0]))
}https://codereview.stackexchange.com/questions/15945
复制相似问题