在Solidity中如何将bytes3类型转换为HEX字符串
问题原因
- 你使用的
string(abi.encodePacked(bytes3(val)))逻辑是将bytes3内的字节直接视为UTF-8编码的字符做转换,而非将字节的十六进制字面量转换为字符串:- 测试
0x00ff08时报错,是因为0x00、0xff都不属于有效的UTF-8可打印字符范围,解码时触发了无效码点错误。 - 测试
0x443322时返回D3",是因为这三个字节刚好对应ASCII字符:0x44对应大写字母D、0x33对应数字3、0x22对应双引号,转换结果和你预期的十六进制字符串完全是两个逻辑。
- 测试
解决方案
你需要自行实现字节转十六进制字面量的转换函数,以下是Solidity 0.8+版本兼容的实现,可直接部署到RSK链使用:
// 转换为不带0x前缀的6位十六进制字符串 function bytes3ToHexString(bytes3 value) public pure returns (string memory) { bytes16 constant HEX_CHARS = "0123456789abcdef"; bytes memory result = new bytes(6); for (uint256 i = 0; i < 3; i++) { uint8 b = uint8(value[i]); result[i*2] = HEX_CHARS[b >> 4]; result[i*2 + 1] = HEX_CHARS[b & 0x0f]; } return string(result); } // 如果需要带0x前缀的8位字符串,可使用下面的版本 function bytes3ToHexStringWithPrefix(bytes3 value) public pure returns (string memory) { bytes16 constant HEX_CHARS = "0123456789abcdef"; bytes memory result = new bytes(8); result[0] = '0'; result[1] = 'x'; for (uint256 i = 0; i < 3; i++) { uint8 b = uint8(value[i]); result[2 + i*2] = HEX_CHARS[b >> 4]; result[2 + i*2 + 1] = HEX_CHARS[b & 0x0f]; } return string(result); }
调用效果:
- 输入
bytes3(0x00ff08),bytes3ToHexString返回"00ff08",bytes3ToHexStringWithPrefix返回"0x00ff08" - 输入
bytes3(0x443322),返回结果为"443322"/"0x443322",完全匹配字符一致的需求。
内容的提问来源于stack exchange,提问作者Aleks Shenshin
相关产品推荐
相关产品推荐

