写了一个合约
contract Test {
bytes public s = '0x0014171f090e000e090e090e090e09020901000b09020901000b09020901000b09020901000b09020901000b09020901000b09020901000b09';
function toUint8Fn(bytes memory _s, uint y) public returns(uint8 value) {
return uint8(_s[y]);
}
function toUint8Fn1(uint y) public returns(uint8) {
return uint8(s[y]);
}
function len(bytes memory x) public view returns(uint) {
return x.length;
}
function len1() public view returns(uint) {
return s.length;
}
}
我的变量s是以 0x开头的bytes变量
通过调用 len方法 传入 s 返回了 57,但是通过 len1方法输出了116,不知道怎么声明 s是一个bytes类型的变量了,还有如何通过web3传bytes参数给合约
这个是因为 bytes public s = '0x0014171f090...' 它被当做了一个字符串, 而不是 16进制数据, 而使用web3 传递的时候,当做了 16进制数据。
在 solidity 代码里, 你应该 这样声明一个 16进制数据:
bytes public s = hex"001417....";
参考 solidity 文档:https://learnblockchain.cn/docs/solidity/types.html#index-11