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

使用 RPM 将字节转为整数编码

使用 RPM 将字节转为整数编码

Go
梦里花落0921 2021-06-11 14:09:29
我正在尝试创建一个无需 librpm 和 rpmbuild 即可读取和创建 RPM 文件的 go 程序。这样做的大部分原因是为了更好地理解 Go 中的编程。我正在根据以下内容解析 RPM:https : //github.com/jordansissel/fpm/wiki/rpm-internals我正在查看标题并尝试解析标签数量+长度,我有以下代码fi, err := os.Open("golang-1.1-2.fc19.i686.rpm")...// headerhead := make([]byte, 16)// read a chunk_, err = fi.Read(head)if err != nil && err != io.EOF { panic(err) }fmt.Printf("Magic number %s\n", head[:8])tags, read := binary.Varint(head[8:12])fmt.Printf("Tag Count: %d\n", tags)fmt.Printf("Read %d\n", read)length, read := binary.Varint(head[12:16])fmt.Printf("Length : %d\n", length)fmt.Printf("Read %d\n", read)我得到以下信息:Magic number ���Tag Count: 0Read 1Length : 0Read 1我打印了切片,我看到了这个:Tag bytes: [0 0 0 7]Length bytes: [0 0 4 132]然后我尝试这样做:length, read = binary.Varint([]byte{4, 132})它返回长度为 2 并读取 1。根据我正在阅读的内容,标签和长度应该是“4 字节‘标签计数’”,那么我如何将四个字节作为一个数字?
查看完整描述

2 回答

?
拉丁的传说

TA贡献1789条经验 获得超8个赞

您正在阅读的数据看起来不像是 Go 的可变长度整数编码。


相反,您可能想要binary.BigEndian.Uint32():


tags := binary.BigEndian.Uint32(head[8:12])

length := binary.BigEndian.Uint32(head[12:16])


查看完整回答
反对 回复 2021-06-28
  • 2 回答
  • 0 关注
  • 159 浏览
慕课专栏
更多

添加回答

举报

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