Solidity合约函数十六进制参数值转换与解码方法咨询
答案
你对布尔类型编码的猜测是正确的。Solidity ABI编码规则中,bool类型会被填充为32字节长度,全0的32字节对应false,末尾为1其余为0的32字节对应true。
uint256十六进制参数解码方法
uint256类型在ABI编码时会统一填充为32字节的十六进制串,也就是你看到的64位(不含0x前缀)的字符串,解码时直接将其视为十六进制整数转换为十进制即可,以下是两种可直接使用的解码方案:
方法1:使用Python解码(无精度损失)
# 第一个参数解码 hex1 = "0000000000000000000000000000000000000000000000a2a15d09519be00000" num1 = int(hex1, 16) print(num1) # 输出:120000000000000000000 # 第二个参数解码 hex2 = "000000000000000000000000000000000000000000000002b5e3af16b1880000" num2 = int(hex2, 16) print(num2) # 输出:5000000000000000000
方法2:使用浏览器控制台解码
直接打开浏览器F12开发者工具的控制台,输入以下代码即可得到结果,使用BigInt避免大整数精度损失:
const hex1 = "0000000000000000000000000000000000000000000000a2a15d09519be00000" console.log(BigInt(`0x${hex1}`).toString()) // 输出120000000000000000000 const hex2 = "000000000000000000000000000000000000000000000002b5e3af16b1880000" console.log(BigInt(`0x${hex2}`).toString()) // 输出5000000000000000000
如果这两个值是代币数量,还需要对应除以对应代币的decimals位(绝大多数代币为18),就能得到常规显示的代币面额:比如第一个值除以1e18等于120,第二个值除以1e18等于5。
内容的提问来源于stack exchange,提问作者Spacebar
相关产品推荐
相关产品推荐

