You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

在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

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.10.02 22:36:01