简体   繁体   English

字节片操作

[英]Byte slice manipulation

I'm writing a program that should parse and reply to network packets but I'm a bit annoyed because I can't do simple C style return (int)buffer[at]; 我正在编写一个程序,该程序应该解析并回复网络数据包,但由于无法执行简单的C样式return (int)buffer[at];我有点恼火return (int)buffer[at]; with an array of bytes. 与字节数组。 Is there any better way to retrieve 4 bytes from byte[] as int32 than the following? 有没有比以下更好的方法从byte []作为int32检索4个字节了?

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])
}

It works correctly but I was thinking if there was a better way to do this. 它可以正常工作,但是我在想是否有更好的方法可以做到这一点。

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

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM