【发布时间】:2021-09-23 13:53:19
【问题描述】:
我需要在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)。上述功能不适用于较新版本。
将bytes 或uint 转换为十六进制字符串 (1->'1',f->'f') 在 Solidity >=0.8.0 中有效的方法是什么?
【问题讨论】:
标签: bit-manipulation solidity rsk