首页 > 后端开发 > Golang > 如何在 Go 中高效地从字节缓冲区中解析整数?

如何在 Go 中高效地从字节缓冲区中解析整数?

DDD
发布: 2024-12-04 01:19:10
原创
940 人浏览过

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

How to 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中文网其他相关文章!

来源:php.cn
本站声明
本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系admin@php.cn
热门教程
更多>
最新下载
更多>
网站特效
网站源码
网站素材
前端模板