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

如何将一片十六进制字节转换为整数

如何将一片十六进制字节转换为整数

Go
杨__羊羊 2023-02-21 19:13:49
在将其存储在文件中之前,我将以 10 为底的整数转换为十六进制字符串:str := fmt.Sprintf("%08x", 1662489944)b, _ := hex.DecodeString(str)file.Write(b) //seems to write 63179558是的,我知道这可能看起来很傻,而且我毫不怀疑有更好的方法可以做到这一点:我想用前导 0 填充这个值。当我读取文件的内容时,我得到了一段字节:[]byte{63, 17, 95, 58}如何将此切片转换回以 10 为底的值 1662489944(32 位)?去
查看完整描述

2 回答

?
慕娘9325324

TA贡献1783条经验 获得超4个赞

以下代码将值作为四字节大端数字写入文件。


str := fmt.Sprintf("%08x", 1662489944)

b, _ := hex.DecodeString(str)

file.Write(b)

使用此代码来反转转换:


b = make([]byte, 4)

io.ReadFull(file, b)

n := int(binary.BigEndian.Uint32(b))

游乐场示例。


这是将数字作为四字节大端数字写入文件的更直接的方法。


b := make([]byte, 4)

binary.BigEndian.PutUint32(b, 1662489944)

file.Write(b)


查看完整回答
反对 回复 2023-02-21
?
喵喔喔

TA贡献1735条经验 获得超5个赞

目前还不太清楚,您的实际十六进制字符串是如何写入文件并读回的。但根据你的评论,


当我在文件上运行 hexdump 时,它显示63 17 95 58


这很明显,您应该处理的字节切片应该是十六进制表示法而不是十进制,即或[]byte{0x63, 0x17, 0x95, 0x58}十进制字节切片[]byte{99, 23, 149, 88},但绝对不是 OP 中发布的那个。这可以通过包中的几种方法来确认hex,这些方法将十六进制字符串编码为字节,反之亦然,


package main


import (

    "encoding/hex"

    "fmt"

    "log"

)


func main() {

    const s = "63179558"

    decoded, err := hex.DecodeString(s)

    if err != nil {

        log.Fatal(err)

    }


    fmt.Printf("%v\n", decoded)

    fmt.Printf("%s\n", hex.EncodeToString([]byte{0x63, 0x17, 0x95, 0x58}))


}

产生


[99 23 149 88]

63179558

证实了我的上述假设。


至于将十六进制字节片转换回基数 10 的原始问题,您可以使用编码/二进制包的ByteOrder实现,转换为 32 位、64 位数字。所以很简单


binary.BigEndian.Uint32([]byte{0x63, 0x17, 0x95, 0x58})


查看完整回答
反对 回复 2023-02-21
  • 2 回答
  • 0 关注
  • 98 浏览
慕课专栏
更多

添加回答

举报

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