如何在Solidity中将bytes1转换为int?代码报错求助
Solidity中bytes1转int类型的解决方案
你遇到的报错:
TypeError: Explicit type conversion not allowed from "bytes1" to "int8"
原因是Solidity不允许直接将无符号的bytes1类型转换为有符号的int8类型。bytes1本质是8位无符号整数,必须先转换为对应的无符号整数类型(比如uint8),再转换为有符号类型。
修正后的代码如下:
int256[] public C; function setVal(string memory C_) public returns(int256[] memory ret1) { bytes memory b = bytes(C_); for (uint i = 0; i < b.length; i++) { if (b[i] >= 0x30 && b[i] <= 0x39) { // 先转uint8再转int256,减去48得到数字值 C.push(int256(uint8(b[i])) - 48); } } return C; }
关键说明
bytes1和uint8是等价的底层类型,所以可以直接转换- 转换为
uint8后,再转为int256(或其他有符号类型),就能安全完成跨符号类型的转换 - 减去48是因为字符'0'-'9'的ASCII码是0x30-0x39(对应十进制48-57),减去48后得到对应的整数0-9
如果需要更清晰的分步写法,也可以拆成两行:
uint8 digitUint = uint8(b[i]); int256 digitInt = int256(digitUint) - 48; C.push(digitInt);
内容的提问来源于stack exchange,提问作者SpaceNinja
相关产品推荐
相关产品推荐

