首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >将字节转换为uint256[]

将字节转换为uint256[]
EN

Ethereum用户
提问于 2018-12-12 15:33:46
回答 1查看 1K关注 0票数 0

我正在编写ERC777TokensRecipient的实现。所以这意味着一个函数

代码语言:javascript
复制
function tokensReceived(address operator, address from, address to, uint256 amount, bytes data, bytes operatorData) external;

data字段包含14个uint256变量

代码语言:javascript
复制
0x000000000000000000000000000000000000000000000000000000000000000100000000000000000000000000000000000000000000000000000000000000020000000000000000000000000000000000000000000000000000000000000003000000000000000000000000000000000000000000000000000000000000000400000000000000000000000000000000000000000000000000000000000000050000000000000000000000000000000000000000000000000000000000000006000000000000000000000000000000000000000000000000000000000000000700000000000000000000000000000000000000000000000000000000000000080000000000000000000000000000000000000000000000000000000000000009000000000000000000000000000000000000000000000000000000000000000a000000000000000000000000000000000000000000000000000000000000000b000000000000000000000000000000000000000000000000000000000000000c000000000000000000000000000000000000000000000000000000000000000d000000000000000000000000000000000000000000000000000000000000000e

我如何才能访问这些变量?

我知道我可以让他们这样:

代码语言:javascript
复制
function tokensReceived(address _operator, address _from, address _to, uint256 _amount, bytes _data, bytes _operatorData) external {
    uint arg1;
    uint arg2;
    uint arg3;
    uint arg4;
    uint arg5;
    uint arg6;
    uint arg7;
    uint arg8;
    uint arg9;
    uint arg10;
    uint arg11;
    uint arg12;
    uint arg13;
    uint arg14;

    bytes memory tmp = _data;
    assembly {
        arg1  := mload(add(0x020, tmp))
        arg2  := mload(add(0x040, tmp))
        arg3  := mload(add(0x060, tmp))
        arg4  := mload(add(0x080, tmp))
        arg5  := mload(add(0x0A0, tmp))
        arg6  := mload(add(0x0C0, tmp))
        arg7  := mload(add(0x0E0, tmp))
        arg8  := mload(add(0x100, tmp))
        arg9  := mload(add(0x120, tmp))
        arg10 := mload(add(0x140, tmp))
        arg11 := mload(add(0x160, tmp))
        arg12 := mload(add(0x180, tmp))
        arg13 := mload(add(0x1A0, tmp))
        arg14 := mload(add(0x1C0, tmp))
    }
}

但是,在遇到

代码语言:javascript
复制
CompilerError: Stack too deep, try removing local variables.

根据编译时出错:堆栈太深的说法,解决办法是把当地的uints放到一个数组中。但我不知道怎么做。

有人知道我怎么写这样的函数吗?

代码语言:javascript
复制
function convertToArrayOfLength14(bytes memory data) internal pure returns (uint[]) {
    // TODO
}
EN

回答 1

Ethereum用户

回答已采纳

发布于 2018-12-12 15:46:14

你可以在这样的循环中这样做:

代码语言:javascript
复制
function convertToArrayOfLength14(bytes memory data) public pure returns (uint256[] memory output)
{
    output = new uint256[](14);
    for (uint256 i=32; i<=output.length*32; i+=32)
    {
        assembly { mstore(add(output, i), mload(add(data, i))) }
    }
}
票数 2
EN
页面原文内容由Ethereum提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://ethereum.stackexchange.com/questions/63994

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档