我需要在Solidity智能合约中存储这样的值0xff0000
或0x00ff08
(十六进制颜色表示),并能够将其转换为带有相同文本字符 "ff0000"
的字符串。我打算在RSK上部署该智能合约。
我的想法是将这些值存储在一个bytes3
或简单的uint
变量中,并拥有一个纯函数将bytes3
或uint
转换为相应的字符串。我找到了一个可以完成工作并在Solidity 0.4.9上运行的函数。
pragma solidity 0.4.9;
contract UintToString {
function uint2hexstr(uint i) public constant returns (string) {
if (i == 0) return "0";
uint j = i;
uint length;
while (j != 0) {
length++;
j = j >> 4;
}
uint mask = 15;
bytes memory bstr = new bytes(length);
uint k = length - 1;
while (i != 0){
uint curr = (i & mask);
bstr[k--] = curr > 9 ? byte(55 + curr ) : byte(48 + curr); // 55 = 65 - 10
i = i >> 4;
}
return string(bstr);
}
}
但是我需要更高版本的编译器(至少0.8.0)。上面的函数在新版本上无法使用。
在Solidity >= 0.8.0上如何将bytes
或uint
转换为十六进制字符串(1->'1',f->'f')?