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

如何在Solidity 0.7中将地址字符串转换为address类型

长度不符的原因

你直接将地址字符串转bytes得到的是字符串每个ASCII字符对应的字节序列:标准以太坊地址字符串是0x开头的42个十六进制字符,每个字符占1字节,所以总长度是42。你在Python里做的是十六进制字符串解码,把每两个十六进制字符映射为1个原始字节,40个十六进制字符(去掉0x前缀)刚好得到20字节的地址原始值,和Solidity里的直接转bytes不是同一个操作。

Solidity 0.7 兼容的地址字符串转address实现

// SPDX-License-Identifier: MIT
pragma solidity ^0.7.0;

library AddressStringUtils {
    function stringToAddress(string memory _addressStr) internal pure returns (address) {
        bytes memory strBytes = bytes(_addressStr);
        // 校验输入长度必须是42(带0x前缀的标准地址)
        require(strBytes.length == 42, "Invalid address string length");
        // 校验前缀为0x
        require(strBytes[0] == '0' && (strBytes[1] == 'x' || strBytes[1] == 'X'), "Missing 0x prefix");
        
        uint160 result = 0;
        // 从第3个字符(索引2)开始遍历每一个十六进制字符
        for (uint256 i = 2; i < 42; i++) {
            uint8 charVal = uint8(strBytes[i]);
            // 转成对应的十六进制数值
            if (charVal >= uint8('0') && charVal <= uint8('9')) {
                charVal -= uint8('0');
            } else if (charVal >= uint8('a') && charVal <= uint8('f')) {
                charVal = charVal - uint8('a') + 10;
            } else if (charVal >= uint8('A') && charVal <= uint8('F')) {
                charVal = charVal - uint8('A') + 10;
            } else {
                revert("Invalid hex character");
            }
            // 每一个字符对应4位,左移4位累加
            result = result * 16 + charVal;
        }
        return address(result);
    }
}

使用说明

  • 直接引用这个库调用stringToAddress方法即可,输入为带0x前缀的标准42位地址字符串,返回对应的address类型值。
  • 内置了长度、前缀、非法字符的校验逻辑,避免错误输入导致转换结果异常。
  • 兼容大小写混合的地址字符串,同时支持EIP-55校验和格式的地址输入,如果你需要额外校验地址的校验和合法性,可以在转换完成后自行添加校验和比对逻辑。

内容的提问来源于stack exchange,提问作者GraphicalDot

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.09.30 04:15:04