2 回答
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)
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})
- 2 回答
- 0 关注
- 140 浏览
添加回答
举报