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

我需要提取字节缓冲区中的各个字段。我想出了这个解决方案:


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)

}

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

  • 我想让偏移量保持明确

  • 我想从字节缓冲区中读取,而不是在可能的情况下从文件中查找和读取。


函数式编程
浏览 194回答 2
2回答

隔江千里

我有一个打包装箱机可以处理这些情况例子示例数据:buffer := new(bytes.Buffer)packer := binpacker.NewPacker(buffer)unpacker := binpacker.NewUnpacker(buffer)packer.PushByte(0x01)packer.PushUint16(math.MaxUint16)打开包装:var val1 bytevar val2 uint16var err errorval1, err = unpacker.ShiftByte()val2, err = unpacker.ShiftUint16()或者var val1 bytevar val2 uint16var err errorunpacker.FetchByte(&val1).FetchUint16(&val2)unpacker.Error() // Make sure error is nil
打开App,查看更多内容
随时随地看视频慕课网APP

相关分类

Go