我要提取长十六进制字符串形式的数据,我需要将其转换为十进制表示法,截断18个小数位,然后在JSON中使用。
例如,我可能具有十六进制字符串:
"0x00000000000000000000000000000000000000000000d3c21bcecceda1000000"
最初我尝试使用ParseUint(),但是由于它支持的最高级别int64,我的数量最终太大了。
ParseUint()
int64
转换和截断后的示例为10 ^ 6。但是,在某些情况下,此数字最多可以为10 ^ 12(意味着截断为10 ^ 30!)。
攻击此问题的最佳策略是什么?
使用math / big处理大于64位的数字。
从Int.SetString示例:
Int.SetString
s := "d3c21bcecceda1000000" i := new(big.Int) i.SetString(s, 16) fmt.Println(i)
https://play.golang.org/p/vf31ce93vA
这些math/big类型还支持encoding.TextMarshaler和fmt.Scanner接口。
math/big
encoding.TextMarshaler
fmt.Scanner
例如
i := new(big.Int) fmt.Sscan("0x000000d3c21bcecceda1000000", i)
要么
i := new(big.Int) fmt.Sscanf("0x000000d3c21bcecceda1000000", "0x%x", i)