Манипулирование байтовым срезом - PullRequest
4 голосов
/ 25 декабря 2010

Я пишу программу, которая должна анализировать и отвечать на сетевые пакеты, но я немного раздражен, потому что я не могу сделать простой стиль C return (int)buffer[at]; с массивом байтов.Есть ли лучший способ получить 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])
}

Это работает правильно, но я подумал, есть ли лучший способ сделать это.

1 Ответ

2 голосов
/ 25 декабря 2010
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
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...