【发布时间】:2021-09-25 18:02:46
【问题描述】:
我正在尝试将一种 0x00ff08 的 uint24 值转换为人类可读的 string,并在我将在 RSK 上部署的 Solidity 智能合约中使用相同的字符。在我关于bytes3 to hex string casting 的问题中,有人建议我出于这些目的使用函数
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)));
}
谁能想到一种更优雅的方式来达到同样的效果?
【问题讨论】:
标签: bit-manipulation solidity rsk