Heim >Backend-Entwicklung >Golang >Wie kann ich Ganzzahlen aus einem Byte-Puffer in Go effizient analysieren?
So analysieren Sie Ganzzahlen aus einem Byte-Puffer in Go
Dieses Codefragment beschreibt eine Methode zum Lesen und Parsen von Ganzzahlen aus einem Byte-Puffer in Los.
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) }
Obwohl dieser Ansatz funktionsfähig ist, gibt es alternative Methoden, die möglicherweise effizienter sind oder idiomatisch.
Vermeiden Sie das Erstellen neuer Puffer
Um zu vermeiden, dass für jeden Lesevorgang ein neuer Puffer erstellt wird, können Sie .Next() verwenden, um die nicht gewünschten Bytes zu überspringen zum Lesen.
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)
Verwenden Sie eine Kopfzeile Struktur
Alternativ können Sie das Lesen von Block für Block vermeiden und eine Header-Struktur erstellen, die Sie direkt mit „binary.Read“ lesen.
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) // ... }
Das obige ist der detaillierte Inhalt vonWie kann ich Ganzzahlen aus einem Byte-Puffer in Go effizient analysieren?. Für weitere Informationen folgen Sie bitte anderen verwandten Artikeln auf der PHP chinesischen Website!