【问题标题】:Byte slice manipulation字节切片操作
【发布时间】:2011-05-30 12:39:31
【问题描述】:

我正在编写一个应该解析和回复网络数据包的程序,但我有点恼火,因为我不能用字节数组做简单的 C 风格 return (int)buffer[at];。有没有比以下更好的方法从 byte[] 检索 4 个字节作为 int32?

func (packet *Packet) GetInt32(at int) int32 {
    return int32(packet.buffer[at]) << 24 +
        int32(packet.buffer[at+1]) << 16 +
        int32(packet.buffer[at+2]) << 8 +
        int32(packet.buffer[at+3])
}

它工作正常,但我在想是否有更好的方法来做到这一点。

【问题讨论】:

  • 你不需要为每个连续的字节增加at吗?
  • 哦,是的,你是对的,我的错误。我目前无法访问源代码,所以我只是快速编写了该函数。

标签: go


【解决方案1】:
package main

import (
    "encoding/binary"
    "fmt"
    "math"
)

type Packet struct {
    buffer []byte
}

func (p *Packet) Int32(i int) int32 {
    return int32(binary.BigEndian.Uint32(p.buffer[i : i+4]))
}

func (p *Packet) Float32(i int) float32 {
    return math.Float32frombits(binary.BigEndian.Uint32(p.buffer[i : i+4]))
}

func main() {
    p := &Packet{buffer: []byte{0x01, 0x02, 0x00, 0x00, 0xFF, 0xFF, 0x07}}
    fmt.Println(p.Int32(2), p.Float32(2))
}


Output:  65535  9.1834e-41

【讨论】:

  • 对浮点数做同样的事情怎么样?
  • 我开始真正爱上 Go。下次我只需要更仔细地阅读这些包!
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2019-03-20
  • 2012-07-16
  • 1970-01-01
  • 2015-07-05
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多