Maison > développement back-end > Golang > Comment analyser efficacement les entiers d'un tampon d'octets dans Go ?

Comment analyser efficacement les entiers d'un tampon d'octets dans Go ?

DDD
Libérer: 2024-12-04 01:19:10
original
948 Les gens l'ont consulté

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

Comment analyser des entiers à partir d'un tampon d'octets dans Go

Cet extrait de code décrit une méthode pour lire et analyser des entiers à partir d'un tampon d'octets dans Allez-y.

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)
}
Copier après la connexion

Bien que cette approche soit fonctionnelle, il existe des méthodes alternatives qui peuvent être plus efficace ou idiomatique.

Évitez de créer de nouveaux tampons

Pour éviter de créer un nouveau tampon pour chaque lecture, vous pouvez utiliser .Next() pour ignorer les octets que vous je ne veux pas lire.

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)
Copier après la connexion

Utiliser un en-tête Structure

Vous pouvez également éviter de lire morceau par morceau et créer une structure d'en-tête que vous lisez directement en utilisant binaire.Read.

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)
    // ...
}
Copier après la connexion

Ce qui précède est le contenu détaillé de. pour plus d'informations, suivez d'autres articles connexes sur le site Web de PHP en chinois!

source:php.cn
Déclaration de ce site Web
Le contenu de cet article est volontairement contribué par les internautes et les droits d'auteur appartiennent à l'auteur original. Ce site n'assume aucune responsabilité légale correspondante. Si vous trouvez un contenu suspecté de plagiat ou de contrefaçon, veuillez contacter admin@php.cn
Tutoriels populaires
Plus>
Derniers téléchargements
Plus>
effets Web
Code source du site Web
Matériel du site Web
Modèle frontal