登录
首页 >  Golang >  Go问答

转换十六进制字节切片为整数的方法

来源:stackoverflow

时间:2024-02-09 20:36:22 234浏览 收藏

今天golang学习网给大家带来了《转换十六进制字节切片为整数的方法》,其中涉及到的知识点包括等等,无论你是小白还是老手,都适合看一看哦~有好的建议也欢迎大家在评论留言,若是看完有所收获,也希望大家能多多点赞支持呀!一起加油学习~

问题内容

我将一个以 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 位)?


正确答案


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

当我在文件上运行 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 的原始问题,您可以使用 encoding/binary 包的 ByteOrder 实现来转换为 32 位、64 位数字。非常简单

binary.bigendian.uint32([]byte{0x63, 0x17, 0x95, 0x58})

Go playground

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

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))

PlayGround example

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

b := make([]byte, 4)
binary.BigEndian.PutUint32(b, 1662489944)
file.Write(b)

理论要掌握,实操不能落!以上关于《转换十六进制字节切片为整数的方法》的详细介绍,大家都掌握了吧!如果想要继续提升自己的能力,那么就来关注golang学习网公众号吧!

声明:本文转载于:stackoverflow 如有侵犯,请联系study_golang@163.com删除
相关阅读
更多>
最新阅读
更多>
课程推荐
更多>