Rumah > pembangunan bahagian belakang > Golang > Bagaimana untuk Menghuraikan Integer dengan Cekap daripada Penampan Byte dalam Go?

Bagaimana untuk Menghuraikan Integer dengan Cekap daripada Penampan Byte dalam Go?

DDD
Lepaskan: 2024-12-04 01:19:10
asal
940 orang telah melayarinya

How to Efficiently Parse Integers from a Byte Buffer in Go?

Cara Menghuraikan Integer daripada Penampan Bait dalam Go

Coretan kod ini menggariskan kaedah untuk membaca dan menghuraikan integer daripada penimbal bait dalam Pergi.

func (fs *FileSystem) readSB() {
    // fs.f is a *os.File
    buf := make([]byte, 1024)
    fs.f.ReadAt(buf, 1024)

    // Offset: type
    var p *bytes.Buffer

    // 0: uint32
    p = bytes.NewBuffer(buf[0:])
    binary.Read(p, binary.LittleEndian, &fs.sb.inodeCount)
    // 4: uint32
    p = bytes.NewBuffer(buf[4:])
    binary.Read(p, binary.LittleEndian, &fs.sb.blockCount)
    // 20: uint32
    p = bytes.NewBuffer(buf[20:])
    binary.Read(p, binary.LittleEndian, &fs.sb.firstDataBlock)
    // 24: uint32
    p = bytes.NewBuffer(buf[24:])
    binary.Read(p, binary.LittleEndian, &fs.sb.blockSize)
    fs.sb.blockSize = 1024 << fs.sb.blockSize
    // 32: uint32
    p = bytes.NewBuffer(buf[32:])
    binary.Read(p, binary.LittleEndian, &fs.sb.blockPerGroup)
    // 40: uint32
    p = bytes.NewBuffer(buf[40:])
    binary.Read(p, binary.LittleEndian, &fs.sb.inodePerBlock)
}
Salin selepas log masuk

Walaupun pendekatan ini berfungsi, terdapat kaedah alternatif yang mungkin lebih cekap atau idiomatik.

Elakkan Mencipta Penampan Baharu

Untuk mengelak daripada mencipta penimbal baharu bagi setiap bacaan, anda boleh menggunakan .Next() untuk melangkau bait yang anda tidak mahu baca.

var p *bytes.Buffer

// Offset: type
p = bytes.NewBuffer(buf)

// 0: uint32
binary.Read(p, binary.LittleEndian, &fs.sb.inodeCount)

// 4: uint32
binary.Read(p, binary.LittleEndian, &fs.sb.blockCount)

// Skip [8:20)
p.Next(12)

// 20: uint32
binary.Read(p, binary.LittleEndian, &fs.sb.firstDataBlock)

// 24: uint32
binary.Read(p, binary.LittleEndian, &fs.sb.blockSize)
fs.sb.blockSize = 1024 << fs.sb.blockSize

// Skip [28:32)
p.Next(4)

// 32: uint32
binary.Read(p, binary.LittleEndian, &fs.sb.blockPerGroup)

// Skip [36:40)
p.Next(4)

// 40: uint32
binary.Read(p, binary.LittleEndian, &fs.sb.inodePerBlock)
Salin selepas log masuk

Gunakan Pengepala Struktur

Sebagai alternatif, anda boleh mengelak daripada membaca ketul demi ketul dan mencipta struktur pengepala yang anda baca terus menggunakan binari.Baca.

type Head struct {
    InodeCount      uint32  //  0:4
    BlockCount      uint32  //  4:8
    Unknown1        uint32  //  8:12
    Unknown2        uint32  // 12:16
    Unknown3        uint32  // 16:20
    FirstBlock      uint32  // 20:24
    BlockSize       uint32  // 24:28
    Unknown4        uint32  // 28:32
    BlocksPerGroup  uint32  // 32:36
    Unknown5        uint32  // 36:40
    InodesPerBlock  uint32  // 40:44
}

func main() {
    var header Head

    // ...
    binary.Read(file, binary.LittleEndian, &header)
    // ...
}
Salin selepas log masuk

Atas ialah kandungan terperinci Bagaimana untuk Menghuraikan Integer dengan Cekap daripada Penampan Byte dalam Go?. Untuk maklumat lanjut, sila ikut artikel berkaitan lain di laman web China PHP!

sumber:php.cn
Kenyataan Laman Web ini
Kandungan artikel ini disumbangkan secara sukarela oleh netizen, dan hak cipta adalah milik pengarang asal. Laman web ini tidak memikul tanggungjawab undang-undang yang sepadan. Jika anda menemui sebarang kandungan yang disyaki plagiarisme atau pelanggaran, sila hubungi admin@php.cn
Tutorial Popular
Lagi>
Muat turun terkini
Lagi>
kesan web
Kod sumber laman web
Bahan laman web
Templat hujung hadapan