首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >Solidity将HEX数字转换为HEX字符串

Solidity将HEX数字转换为HEX字符串
EN

Stack Overflow用户
提问于 2021-09-23 13:53:19
回答 1查看 3.1K关注 0票数 7

我需要将这类0xff00000x00ff08 (十六进制颜色表示)的值存储在可靠的智能契约中,并能够将其转换为具有相同文本字符"ff0000"的字符串。我打算在RSK上部署这个智能合同。

我的想法是将这些值存储在bytes3或简单的uint变量中,并拥有一个将bytes3uint转换为相应字符串的纯函数。我找到了一个函数,可以做这个工作,并致力于稳定0.4.9。

代码语言:javascript
复制
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')的方法是什么?

EN

回答 1

Stack Overflow用户

回答已采纳

发布于 2021-09-23 14:52:49

以下编译,并使用solc 0.8.7进行了测试--与原始版本相同,并作了以下修改:

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

上述更改克服了原始函数中所有编译时的差异。..。但是,仍然有一个运行时错误导致此函数恢复:

在调试过程中,行bstr[k--] = curr > 9 ?在它所在的循环的最后一次迭代中触发了还原。这是因为was循环的设置使得k在其最后一次迭代中是0

虽然识别很棘手,但修复很简单:将减缩操作符从from固定到前缀- bstr[--k] = curr > 9 ?

撇开: 问:为什么在solc 0.4.9编译时不恢复,而在solc 0.8.7中编译相同的代码时才恢复? 答:Solc0.8.0引入了一个改变,编译器插入了uint溢出和下溢检查。在此之前,需要使用SafeMath或类似的方法来完成相同的任务。请参阅solc 0.8发行说明的“语义的静默更改”部分。

代码语言:javascript
复制
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);
    }
}
票数 4
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/69301408

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档