我提取长十六进制字符串形式的数据,我需要将其转换为十进制表示法,截断18位小数,然后以JSON格式提供。
例如,我可能有十六进制字符串:
"0x00000000000000000000000000000000000000000000d3c21bcecceda1000000"
起初我尝试使用ParseUint()
,但由于它支持的最高值为int64
,因此我的号码太大了。
转换和截断后的这个例子导致10 ^ 6。 然而,有些情况下这个数字可能高达10 ^ 12(意味着预截断10 ^ 30!)。
攻击此问题的最佳策略是什么?
答案 0 :(得分:6)
使用math/big处理大于64位的数字。
来自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
接口。
例如
i := new(big.Int)
fmt.Sscan("0x000000d3c21bcecceda1000000", i)
或
i := new(big.Int)
fmt.Sscanf("0x000000d3c21bcecceda1000000", "0x%x", i)