Solidity
在solidity 0.5.x之後將地址轉換為字元串
在solidity 0.5.x 發布後,從地址到字元串的轉換似乎都沒有工作。我已經在 remix 上測試了所有這些,並得到了錯誤,比如將字節轉換為 uint 或類似的東西。
這個還原混音:
function toString(address x) external pure returns (string memory) { bytes memory b = new bytes(20); for (uint i = 0; i < 20; i++) b[i] = byte(uint8(uint(x) / (2**(8*(19 - i))))); return string(b); }
這個向我展示了從 bytes1 到 uint256 的某些內容是不允許的
function addressToString(address _addr) public pure returns(string memory) { bytes32 value = bytes32(uint256(_addr)); bytes memory alphabet = "0123456789abcdef"; bytes memory str = new bytes(51); str[0] = '0'; str[1] = 'x'; for (uint i = 0; i < 20; i++) { str[2+i*2] = alphabet[uint(value[i + 12] >> 4)]; str[3+i*2] = alphabet[uint(value[i + 12] & 0x0f)]; } return string(str); }
有什麼正確的方法可以將地址轉換為字元串嗎?即使通過字節或字節32。
我需要這個的原因是我有一個帶有字元串 => PrivilegeData 映射的權限契約,並且我從該字元串呼叫全域權限,如“voting_time_limit”。對於特定地址,我想使用解析為“0x252f …”之類的字元串的地址呼叫。
試試這個。
pragma solidity > 0.5.1; contract Test { function test() public view returns (string memory) { return addressToString(address(this)); } function addressToString(address _addr) public pure returns(string memory) { bytes32 value = bytes32(uint256(uint160(_addr))); bytes memory alphabet = "0123456789abcdef"; bytes memory str = new bytes(51); str[0] = '0'; str[1] = 'x'; for (uint256 i = 0; i < 20; i++) { str[2+i*2] = alphabet[uint8(value[i + 12] >> 4)]; str[3+i*2] = alphabet[uint8(value[i + 12] & 0x0f)]; } return string(str); } }