bit-manipulation - 在 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)));
}
谁能想到一种更优雅的方式来达到同样的效果?
解决方案
这一行:
for(uint k = 5; k >= 0; k -= 1) {
如果k
是 type uint
,什么k >= 0
时候评估为假?(提示:从不)
k
从类型更改uint
为int
,问题就解决了。
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;
}
推荐阅读
- sql - 向包含数据的表添加检查约束
- django - 如何在Django中的资源URL中输出IP地址后的端口?
- marklogic - 使用 Search API 进行跨文档搜索和排序
- wordpress - 创建后在属性中启用存档 (Woocommerce)
- python-3.x - How to move the files from one folder to other folder based on time or date
- javascript - Chrome 和 IE11 中的地图标记图像质量不佳
- android - 显示 Snackbar 时布局会缩小内容
- python - 包含微平均和宏观平均 F1 分数的表
- c# - Is it possible to have two or more active modal windows at the same time?
- javascript - PHP returns whitespace character before anything after AJAX request