我正在尝试将一种类型的 uint24 值转换为具有相同字符0x00ff08
的人类可读string
的 Solidity 智能合约,我将在 RSK 上部署该合约。在我关于bytes3 到十六进制字符串转换的问题中,我被建议出于这些目的使用一个函数
function uint24tohexstr(uint24 i) public pure returns (string memory) {
bytes memory o = new bytes(6);
uint24 mask = 0x00000f;
o[5] = bytes1(uint8tohexchar(uint8(i & mask)));
i = i >> 4;
o[4] = bytes1(uint8tohexchar(uint8(i & mask)));
i = i >> 4;
o[3] = bytes1(uint8tohexchar(uint8(i & mask)));
i = i >> 4;
o[2] = bytes1(uint8tohexchar(uint8(i & mask)));
i = i >> 4;
o[1] = bytes1(uint8tohexchar(uint8(i & mask)));
i = i >> 4;
o[0] = bytes1(uint8tohexchar(uint8(i & mask)));
return string(o);
}
我想在该函数中使用一个循环并像这样重写它
function uint24ToHexStr(uint24 i) public pure returns (string memory) {
bytes memory o = new bytes(6);
uint24 mask = 0x00000f; // hex 15
for(uint k = 5; k >= 0; k -= 1) {
o[k] = bytes1(uint8ToHexCharCode(uint8(i & mask)));
i >>= 4;
}
return string(o);
}
但不幸的是,这个函数会导致运行时错误,因为在最后一次迭代中,无符号整数k
变为-1
. 我首先想到的是将 k 加一,这样
for(uint k = 6; k >= 1; k -= 1) {
o[k - 1] = bytes1(uint8ToHexCharCode(uint8(i & mask)));
}
谁能想到一种更优雅的方式来达到同样的效果?