加入收藏 | 设为首页 | 会员中心 | 我要投稿 李大同 (https://www.lidatong.com.cn/)- 科技、建站、经验、云计算、5G、大数据,站长网!
当前位置: 首页 > 大数据 > 正文

如何在Golang的字节缓冲区中解压缩各种形式的整数?

发布时间:2020-12-16 19:19:55 所属栏目:大数据 来源:网络整理
导读:我需要在字节缓冲区中提取各种字段。我想出了这个解决方案: 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:]) bi
我需要在字节缓冲区中提取各种字段。我想出了这个解决方案:
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,&fs.sb.blockCount)
    // 20: uint32
    p = bytes.NewBuffer(buf[20:])
    binary.Read(p,&fs.sb.firstDataBlock)
    // 24: uint32
    p = bytes.NewBuffer(buf[24:])
    binary.Read(p,&fs.sb.blockSize)
    fs.sb.blockSize = 1024 << fs.sb.blockSize
    // 32: uint32
    p = bytes.NewBuffer(buf[32:])
    binary.Read(p,&fs.sb.blockPerGroup)
    // 40: uint32
    p = bytes.NewBuffer(buf[40:])
    binary.Read(p,&fs.sb.inodePerBlock)
}

有没有更好的/惯用的/直接的方法来做到这一点?

>我想保持偏移显式
>我想从字节缓冲区读取,尽可能不寻求和从文件中读取。

您可以避免每次使用 .Next()创建一个新的缓冲区来跳过不想读取的字节:
{
    // Offset: type
    p := bytes.NewBuffer(buf)

    // 0: uint32
    binary.Read(p,&fs.sb.inodeCount)

    // 4: uint32
    binary.Read(p,&fs.sb.blockCount)

    // Skip [8:20)
    p.Next(12)

    // 20: uint32
    binary.Read(p,&fs.sb.firstDataBlock)

    // 24: uint32
    binary.Read(p,&fs.sb.blockSize)
    fs.sb.blockSize = 1024 << fs.sb.blockSize

    // Skip [28:32)
    p.Next(4)

    // 32: uint32
    binary.Read(p,&fs.sb.blockPerGroup)

    // Skip [36:40)
    p.Next(4)

    // 40: uint32
    binary.Read(p,&fs.sb.inodePerBlock)
}

或者您可以避免通过chunk读取块,并创建一个头文件结构,您可以直接使用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

    err = binary.Read(file,&header)

    if err != nil {
        log.Fatal(err)
    }

    log.Printf("%#vn",header)
}

(编辑:李大同)

【声明】本站内容均来自网络,其相关言论仅代表作者个人观点,不代表本站立场。若无意侵犯到您的权利,请及时与联系站长删除相关内容!

    推荐文章
      热点阅读