gpt4 book ai didi

bit-manipulation - Solidity 将 HEX 数字转换为 HEX 字符串

转载 作者:行者123 更新时间:2023-12-04 11:29:11 30 4
gpt4 key购买 nike

我需要存储这种类型的值 0xff00000x00ff08 (十六进制颜色表示)在solidity智能合约中,并且能够在合约内将其转换为具有相同文本字符的字符串"ff0000" .我打算在 RSK 上部署这个智能合约。
我的想法是将这些值存储在 bytes3 中或者干脆 uint变量并有一个纯函数转换 bytes3uint到相应的字符串。我找到了一个可以完成工作并致力于 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)。上述功能不适用于较新版本。
有什么方法可以转换 bytesuint到十六进制字符串 (1->'1',f->'f') 什么在 Solidity >=0.8.0 中有效?

最佳答案

以下编译,并使用 solc 0.8.7 进行测试
它与您的原始版本相同,但有以下修改:

  • constant --> pure
  • returns (string) --> returns (string memory)
  • byte(...) --> bytes1(uint8(...))

  • 上述更改克服了原始函数中的所有编译时差异。
    ...但是仍然存在导致此函数恢复的运行时错误:
    调试时,线路 bstr[k--] = curr > 9 ?在它所在的循环的最后一次迭代中触发了恢复。这是因为 while 循环的设置使得 k0在它的最后一次迭代中。
    虽然识别很棘手,但修复很简单:将递减运算符从后缀更改为前缀 - bstr[--k] = curr > 9 ? .

    Aside:

    Q: Why did this not revert when compiled in solc 0.4.9,but revert when the same code was compiled in solc 0.8.7?

    A: solc 0.8.0 introduced a breaking change where uint overflow and underflow checks were inserted by the compiler.Prior to this one would have needed to use SafeMath or similar to accomplish the same.See the "Silent Changes of the Semantics" section of the solc 0.8 release notes

    pragma solidity >=0.8;

    contract TypeConversion {
    function uint2hexstr(uint i) public pure returns (string memory) {
    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;
    while (i != 0) {
    uint curr = (i & mask);
    bstr[--k] = curr > 9 ?
    bytes1(uint8(55 + curr)) :
    bytes1(uint8(48 + curr)); // 55 = 65 - 10
    i = i >> 4;
    }
    return string(bstr);
    }
    }

    关于bit-manipulation - Solidity 将 HEX 数字转换为 HEX 字符串,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/69301408/

    30 4 0
    Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
    广告合作:1813099741@qq.com 6ren.com