Go의 바이트 버퍼에서 정수를 구문 분석하는 방법
이 코드 조각은 Go의 바이트 버퍼에서 정수를 읽고 구문 분석하는 방법을 간략하게 설명합니다. 가세요.
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) }
이 접근 방식은 기능적이지만 다음과 같은 문제가 있습니다. 더 효율적이거나 관용적일 수 있는 대체 방법.
새 버퍼 생성 방지
읽을 때마다 새 버퍼가 생성되는 것을 방지하려면 .Next()를 사용하여 다음을 수행할 수 있습니다. 읽고 싶지 않은 바이트는 건너뛰세요.
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)
헤더 사용 구조
또는 청크별로 읽는 것을 피하고 Binary.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) // ... }
위 내용은 Go의 바이트 버퍼에서 정수를 효율적으로 구문 분석하는 방법은 무엇입니까?의 상세 내용입니다. 자세한 내용은 PHP 중국어 웹사이트의 기타 관련 기사를 참조하세요!