首页 > 解决方案 > 在 Solidity 中将 uint24 转换为 HEX 字符串

问题描述

我正在尝试将一种类型的 uint24 值转换为具有相同字符0x00ff08的人类可读string的 Solidity 智能合约,我将在 RSK 上部署该合约。在我关于bytes3 到十六进制字符串转换的问题中,我被建议出于这些目的使用一个函数

function uint24tohexstr(uint24 i) public pure returns (string memory) {
        bytes memory o = new bytes(6);
        uint24 mask = 0x00000f;
        o[5] = bytes1(uint8tohexchar(uint8(i & mask)));
        i = i >> 4;
        o[4] = bytes1(uint8tohexchar(uint8(i & mask)));
        i = i >> 4;
        o[3] = bytes1(uint8tohexchar(uint8(i & mask)));
        i = i >> 4;
        o[2] = bytes1(uint8tohexchar(uint8(i & mask)));
        i = i >> 4;
        o[1] = bytes1(uint8tohexchar(uint8(i & mask)));
        i = i >> 4;
        o[0] = bytes1(uint8tohexchar(uint8(i & mask)));
        return string(o);
    }

我想在该函数中使用一个循环并像这样重写它

function uint24ToHexStr(uint24 i) public pure returns (string memory) {
        bytes memory o = new bytes(6);
        uint24 mask = 0x00000f; // hex 15
        for(uint k = 5; k >= 0; k -= 1) {
          o[k] = bytes1(uint8ToHexCharCode(uint8(i & mask)));
          i >>= 4;
        }
        return string(o);
    }

但不幸的是,这个函数会导致运行时错误,因为在最后一次迭代中,无符号整数k变为-1. 我首先想到的是将 k 加一,这样

        for(uint k = 6; k >= 1; k -= 1) {
          o[k - 1] = bytes1(uint8ToHexCharCode(uint8(i & mask)));
        }

谁能想到一种更优雅的方式来达到同样的效果?

标签: bit-manipulationsolidityrsk

解决方案


这一行:

for(uint k = 5; k >= 0; k -= 1) {

如果k是 type uint,什么k >= 0时候评估为假?(提示:从不)

k从类型更改uintint,问题就解决了。

    for(int k = 5; k >= 0; k -= 1) {
      o[k] = bytes1(uint8ToHexCharCode(uint8(i & mask)));
      i >>= 4;
    }

或者

    for(uint k = 0; k< 6; k += 1) {
      o[5-k] = bytes1(uint8ToHexCharCode(uint8(i & mask)));
      i >>= 4;
    }

推荐阅读