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

在将其存储在文件中之前,我将以 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 位)?



杨__羊羊
浏览 141回答 2
2回答

慕娘9325324

以下代码将值作为四字节大端数字写入文件。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)

喵喔喔

目前还不太清楚,您的实际十六进制字符串是如何写入文件并读回的。但根据你的评论,当我在文件上运行 hexdump 时,它显示63 17 95 58这很明显,您应该处理的字节切片应该是十六进制表示法而不是十进制,即或[]byte{0x63, 0x17, 0x95, 0x58}十进制字节切片[]byte{99, 23, 149, 88},但绝对不是 OP 中发布的那个。这可以通过包中的几种方法来确认hex,这些方法将十六进制字符串编码为字节,反之亦然,package mainimport (    "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})
打开App,查看更多内容
随时随地看视频慕课网APP

相关分类

Go