- html - 出于某种原因,IE8 对我的 Sass 文件中继承的 html5 CSS 不友好?
- JMeter 在响应断言中使用 span 标签的问题
- html - 在 :hover and :active? 上具有不同效果的 CSS 动画
- html - 相对于居中的 html 内容固定的 CSS 重复背景?
我之前问过 converting uint to hex string .现在我想将十六进制值 0x00ff08
存储在 bytes3
变量中,并能够将其转换为 Solidity 智能合约中的 string
。随后我打算将它部署在 RSK 上,Solidity 编译器版本至少为 0.8.0。
我试过这个 string(abi.encodePacked(bytes3(
0x00ff08
)))
但它抛出一个运行时错误
无法解码输出:null:偏移量 1 处的无效代码点;错误的代码点前缀(argument="bytes", value={"0":0,"1":255,"2":8}, code=INVALID_ARGUMENT, version=strings/5.4.0)
不同的参数 string(abi.encodePacked(bytes3(
0x443322
)))
不会导致一个错误,但返回一个非常奇怪的 D3"
结果。这里可能是什么问题?如何将 bytes3
转换为 string
相同的字符?
最佳答案
您观察到的行为的原因
abi.encodePacked(myBytes3)
产生 3 个字节,因为每 2 个十六进制字符产生 1 个字节。因此,当您将其包装在 string(..)
中时,您会得到一个每 1 个字节包含 1 个字符的字符串,在本例中,结果是包含 3 个字符的字符串。对于某些输入,这会产生一个字符串,可以呈现为人类可读的字符串。在其他情况下,它会导致字符串不存在,因此会出现解析错误。
解决方案
在这种情况下,您不能使用 abi.encodePacked(..)
,因为“打包”与您要完成的相反 - 呈现一个bytes3
作为十六进制 string
- 人类可读的 ASCII 编码 - 你需要做类似的事情 my answer to your previous question ,其中结合使用位移位和位掩码来每半字节提取一个字符。
代码
将单个 uint8
转换为十六进制表示它的 ASCII 字符的实用函数:
function uint8tohexchar(uint8 i) public pure returns (uint8) {
return (i > 9) ?
(i + 87) : // ascii a-f
(i + 48); // ascii 0-9
}
将 uint24
转换为 6 个字符的十六进制 string
的函数。
请注意,由于这次您不是在寻找“通用”解决方案,而是特定于 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);
}
最后,您可能需要一个显式接受 bytes3
作为参数的函数。
请注意,这纯粹是为了方便起见,因为它实际上所做的只是类型转换。 bytes3
和 uint24
可以简单地视为以不同方式查看/解释的“24 位”。
function bytes3tohexstr(bytes3 i) public pure returns (string memory) {
uint24 n = uint24(i);
return uint24tohexstr(n);
}
关于bit-manipulation - 如何在 Solidity 中将 bytes3 转换为 HEX 字符串,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/69312285/
我一直在研究这段代码,但我找不到问题所在。该程序确实可以编译并运行,但最终出现 fatal error 。 程序读取文件并收集数字以计算总数(将它们转换为 float 后)。然后它读取文件并显示小于
我是计算机科学的新手,最近上了一节课。我正在努力解决这个问题,尽管我知道按位运算,但我还是不太明白 问题图片: 我可以有一个明确的解释吗? 最佳答案 答案:B 解释: 使用德摩根定律 (https:/
我发现了这个问题, 编写一个不使用乘法返回给定整数 n 的平方的函数。 对此的解决方法是 public static int sq(int n){ int i = n;
我在某处听说使用 XOR 是不可逆的(他们谈到了加密),但我不明白这是什么意思? AFAIK 即使使用 OR 操作,您也无法找出两个位中的哪一个是 1。请知道这意味着什么的人可以向我解释一下吗? 谢谢
由于一些原始研究和需要为其开发工具,我想出了一些新的,我希望能更好/更快地执行某些数学运算。 Atm 我正在研究伪代码,将它们发布在网站上,以回答已经提出的问题。 然而,在我这样做之前,我想尽可能地优
我经常遇到使用位运算符来做快速、简单和优雅的事情的人。我想学习一些有用的技巧。有哪些最有用的按位运算符案例? 最佳答案 恒定时间 2-幂运算: x = 1 << n; // x = pow(2, n)
我们需要为我的计算机体系结构类编写一个模拟IEEE浮点数除法的程序。我几乎已经做到了,但是我认为查看程序在APL中的样子会很有趣,但是据我所知,没有(简单的)方法可以在APL中进行按位运算(按位和/或
我正在寻找具有以下特征的按位运算序列以下属性: | 00 01 10 11 ---|--------------- 00 | 00 01 | 01 01 10 | 00 01 00
我有一系列位标志,其顺序类似于 {none=0x00, puppies=0x01, kittens=0x02, cute=0x04, funny=0x08, scary=0x10} 等等。 每当用户进
我正在尝试有效地执行以下任务: INPUT VALUE: 01101011 MASK: 00110010 MASK RESULT: --10--1- AGGREGATED: 00000
我需要一种快速的方法来计算位向量的索引间隔的设置位数。例如,给定 10000100100011000 和索引区间 [2, 5],返回值为 2。索引从右边的 0 开始。我有很多疑问要以这种方式完成。分别
我有以下表达式来计算奇偶校验位: AB0E 异或 73C9 异或 D46A 异或 06E3 这将如何评估?是吗: (((AB0E XOR 73C9) XOR D46A) XOR 06E3) 或者是:
我需要对 7 位值进行任意重新排序(是的,我知道我应该使用表格)并且想知道是否有任何技巧可以做到这一点。 例子: // -> // the naive way out = (0x020 &
假设我有这两个数字: x = 0xB7 y = 0xD9 它们的二进制表示是: x = 1011 0111 y = 1101 1001 现在我想在给定点交叉(GA),比如从位置 4 开始。 预期的结果
我想知道是否有办法使用按位运算符屏蔽 int 值列表,并使用该掩码来知道 int 值是否是掩码中的值之一。 即如果我有值 129 和 17,如何计算一个掩码,告诉我一个 int 值是否在掩码中对应(如
我需要使用卡片外的字节码验证器来验证Java Card程序(盖帽文件)。 我已经手动修改了cap文件中的信息,并且我想验证新的cap文件是否类型正确。 我尝试使用com.sun.javacard.sc
我正在尝试找到实现此目标的正确方法的方法: 想象一下,我们有一组位集,如下所示: 00100 00101 10000 00010 10001 我想测试一下,哪些位在所有位集中仅设置了一次。在该示例中,
我不完全理解这种计算奇偶校验位的算法。 有人可以详细解释一下吗? 以下代码摘自《黑客的喜悦》一书: int parity(unsigned x) { unsigned y; y = x ^
我有一个任意 8 位二进制 数字,例如,11101101 我必须交换所有的位,如: 交换前:11-10-11-01交换后:11-01-11-10 我在面试中被问到这个问题! 最佳答案 在伪代码中: x
在我的国际象棋引擎中,它使用位板来表示棋盘的状态,一次生成一大块伪合法移动,结果是位板。例如: 棋子: 稍后一点位板魔法: 最后的位板只是一大块可能的 Action 。引擎通常如何获取此位板并从中生成
我是一名优秀的程序员,十分优秀!