web3.utils.hexToAscii返回乱码,无法获取正确数据的问题咨询
解决web3.utils.hexToAscii()返回乱码问题
问题原因
你传入的十六进制字符串并非纯ASCII对应的十六进制,而是以太坊ABI编码的结构化数据。hexToAscii()仅能处理纯ASCII字符的十六进制编码,直接转换会把地址、数值、偏移量等非ASCII字节转成乱码,只有后续的字符串部分能正常解析。
正确解决方法
使用web3的ABI解码方法web3.eth.abi.decodeParameters()解析结构化数据,再拼接出预期结果:
步骤1:定义参数类型
根据传入的ABI数据结构,定义对应的参数类型数组:
const paramTypes = [ 'address', // 转账发起地址 'address', // 转账接收地址 'uint256', // 转账数值(原始精度) 'string', // 描述文本1 'string' // 描述文本2 ];
步骤2:解码数据并处理结果
// 你的目标十六进制数据 const hexData = '0x0000000000000000000000006fdaa94a8a24ec47f04b8b5b21c4bfcedf8c79560000000000000000000000006fd92ca99c1df9b3cc318bd8f54463537bb8b32900000000000000000000000000000000000000000000000000000000000002bc00000000000000000000000000000000000000000000000000000000000000a000000000000000000000000000000000000000000000000000000000000000e0000000000000000000000000000000000000000000000000000000000000000e546f6b656e207472616e7366657200000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000033130310000000000000000000000000000000000000000000000000000000000'; // 解码ABI数据 const decoded = this.web3.eth.abi.decodeParameters(paramTypes, hexData); // 处理数值精度(假设代币小数位为6,根据实际情况调整) const amount = decoded[2] / Math.pow(10, 6); // 0x2bc = 700,700/1000000=0.0007 // 拼接预期结果 const finalResult = `${amount} ${decoded[3]} ${decoded[4]}`; console.log(finalResult); // 输出:0.0007 Token transfer 101
关键说明
- ABI编码的数据包含多类型结构化字段,不能直接用
hexToAscii()全量转换,必须按对应类型解码。 - 数值的小数位需要根据实际代币的
decimals参数调整,示例中用6位是因为700转成0.0007符合预期。
内容的提问来源于stack exchange,提问作者premchand
相关产品推荐
相关产品推荐

