在將其存盤在檔案中之前,我將基數 10 整數轉換為十六進制字串:
str := fmt.Sprintf("x", 1662489944)
b, _ := hex.DecodeString(str)
file.Write(b) //seems to write 63179558
是的,我知道這可能看起來很傻,我毫不懷疑有更好的方法來做到這一點:我想用前導 0 填充這個值。
當我讀取檔案的內容時,我得到了一段位元組:
[]byte{63, 17, 95, 58}
如何將此切片轉換回基數為 10 的值 1662489944(32 位)?
uj5u.com熱心網友回復:
目前還不太清楚,您的實際十六進制字串是如何寫入檔案并讀回的。但根據你的評論,
當我在檔案上運行 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})
去游樂場
uj5u.com熱心網友回復:
以下代碼將值作為四位元組大端數寫入檔案。
str := fmt.Sprintf("x", 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)
轉載請註明出處,本文鏈接:https://www.uj5u.com/shujuku/512019.html
標籤:去
