首页
学习
活动
专区
圈层
工具
发布
首页
学习
活动
专区
圈层
工具
MCP广场
社区首页 >问答首页 >有效地将小端字节片转换为int32

有效地将小端字节片转换为int32
EN

Code Review用户
提问于 2012-09-26 06:13:21
回答 2查看 24.6K关注 0票数 11

我有一个字节数据流,我想从四个字节得到一个小的endian编码的int32。有比像下面的代码这样做更好的方法吗?

代码语言:javascript
运行
复制
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
}

上面的代码似乎工作得很好,但可能有一个内置的函数,我已经错过了,或者有一个超级酷的黑客可以在一条指令中做到这一点?

EN

回答 2

Code Review用户

发布于 2012-11-03 02:04:21

encoding/binary包可能有您需要的东西。检查这个:http://golang.org/pkg/encoding/binary/#example_朗读

使用修改后的read_int32函数的代码可以是:

代码语言:javascript
运行
复制
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来解释大端

票数 14
EN

Code Review用户

发布于 2014-08-15 17:10:18

这是一个很晚的答案,但是有两种不同的方法。

代码语言:javascript
运行
复制
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]))
}
票数 3
EN
页面原文内容由Code Review提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://codereview.stackexchange.com/questions/15945

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档