实度将十六进制数字转换为十六进制字符串 [英] Solidity convert HEX number to HEX string

查看:21
本文介绍了实度将十六进制数字转换为十六进制字符串的处理方法,对大家解决问题具有一定的参考价值,需要的朋友们下面随着小编来一起学习吧!

问题描述

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

我的想法是将这些值存储在bytes3或简单的uint变量中,并使用一个纯函数将bytes3uint转换为相应的字符串。我找到了一个函数,它可以处理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’)的方法是什么?

推荐答案

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

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

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

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

虽然标识很棘手,但解决方法很简单:将递减运算符从后缀更改为前缀-bstr[--k] = curr > 9 ?

旁注:

问:为什么在Solc 0.4.9中编译时没有恢复, 但在Solc 0.8.7中编译相同的代码时是否恢复?

A:Solc 0.8.0引入了一个突破性的变化,编译器在其中插入了uint溢出和下溢检查。 在此之前,需要使用SafeMath或类似的工具来完成相同的任务。 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);
    }
}

这篇关于实度将十六进制数字转换为十六进制字符串的文章就介绍到这了,希望我们推荐的答案对大家有所帮助,也希望大家多多支持IT屋!

查看全文
登录 关闭
扫码关注1秒登录
发送“验证码”获取 | 15天全站免登陆