为了账号安全,请及时绑定邮箱和手机立即绑定

使用 Go 中的结构更新 mmap 文件

使用 Go 中的结构更新 mmap 文件

Go
HUX布斯 2022-10-04 15:57:15
与将结构写入映射内存文件(mmap)类似,如何将结构写入 mmap 文件或使用 Go 中的结构更新 mmap 文件?假设我的二进制文件以二进制标头开头type MVHD struct {    Version      byte    Flags        [3]byte    DateCreated  time.Time    DateModified time.Time    TimeUnit        uint32 // time unit per second (default = 600)    DurationInUnits uint64 // time length (in time units)    Raw []byte // undecoded data after decoded bits above}假设我想将其映射为内存文件并更新字段,这可能吗?DateModified(我在Go中对mmap的有限阅读是它只能通过字节数组访问,但我确信有一种方法可以通过结构来访问它。我在这里找到了一个使用,但它太复杂了,我无法掌握基本思想)reflect
查看完整描述

1 回答

?
呼如林

TA贡献1798条经验 获得超3个赞

您可以使用编码/二进制来读/写固定大小的结构。此方法是可移植的,不依赖于内存布局、编译器或 CPU 体系结构。例如:

// Note: using uint32 instead of time.Time for decoding.

// Convert to time.Time afterwards if needed.

type MVHD struct {

    Version          byte

    Flags            [3]byte

    DateCreatedSecs  uint32

    DateModifiedSecs uint32


    TimeUnit        uint32 // time unit per second (default = 600)

    DurationInUnits uint64 // time length (in time units)

}


// ..or use binary.BigEndian - whichever is correct for your data.

var endian = binary.LittleEndian


func decode(rd io.Reader) (*MVHD, error) {

    var header MVHD 

    if err := binary.Read(rd, endian, &header); err != nil {

        return nil, err

    }

    return &header, nil

}      

用于将 转换为 .这将允许您使用 mmap 数据。bytes.NewReader[]byteio.Readerdecode


或者,您可以手动对其进行解码:


func decode2(buf []byte) (*MVHD, error) {

    if len(buf) < 24 {

        return nil, errors.New("not enough data")

    }  

    return &MVHD{

        Version:          buf[0],

        Flags:            [3]byte{buf[1], buf[2], buf[3]},

        DateCreatedSecs:  binary.LittleEndian.Uint32(buf[4:8]),

        DateModifiedSecs: binary.LittleEndian.Uint32(buf[8:12]),

        TimeUnit:         binary.LittleEndian.Uint32(buf[12:16]),

        DurationInUnits:  binary.LittleEndian.Uint64(buf[16:24]),

    }, nil

}

同样,您可以使用二进制文件就地更新数据。字节顺序调用:Put


func updateDateModified(buf []byte, t uint32) error {

    if len(buf) < 12 {

        return errors.New("not enough data")

    }

    binary.LittleEndian.PutUint32(buf[8:12], t)

    return nil

}


查看完整回答
反对 回复 2022-10-04
  • 1 回答
  • 0 关注
  • 77 浏览
慕课专栏
更多

添加回答

举报

0/150
提交
取消
意见反馈 帮助中心 APP下载
官方微信