>백엔드 개발 >Golang >Go의 바이트 버퍼에서 정수를 효율적으로 구문 분석하는 방법은 무엇입니까?

Go의 바이트 버퍼에서 정수를 효율적으로 구문 분석하는 방법은 무엇입니까?

DDD
DDD원래의
2024-12-04 01:19:10946검색

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

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 중국어 웹사이트의 기타 관련 기사를 참조하세요!

성명:
본 글의 내용은 네티즌들의 자발적인 기여로 작성되었으며, 저작권은 원저작자에게 있습니다. 본 사이트는 이에 상응하는 법적 책임을 지지 않습니다. 표절이나 침해가 의심되는 콘텐츠를 발견한 경우 admin@php.cn으로 문의하세요.