首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >将bytes16转换为int128

将bytes16转换为int128
EN

Ethereum用户
提问于 2021-10-24 14:08:43
回答 1查看 191关注 0票数 1

我正在做一个分散的游戏,一个由情节组成的世界。它有一张地图,它将一个位置与一个地块结构连接起来。一个位置被保存为一个bytes16,但是表示两个int64 (坐标可以是负的,中心在0,0)。如何将它们转换为int64 (似乎只能将它们转换为uint64)?

以下是我尝试过的:

代码语言:javascript
复制
    function convertToCoordinates(bytes32 input)
        public
        pure
        returns (uint128 x, uint128 y)
    {
        bytes16 xbytes;
        bytes16 ybytes;
        (xbytes, ybytes) = split(input);

        x = int128(int128(uint128(xbytes)) - 2**127 - 1);
        y = int128(int128(uint128(ybytes)) - 2**127 - 1);
    }
EN

回答 1

Ethereum用户

回答已采纳

发布于 2021-10-26 16:02:15

以下是一个解决方案:

代码语言:javascript
复制
    function split(bytes32 source) public pure returns (bytes16 x, bytes16 y) {
        bytes16[2] memory output = [bytes16(0), 0];
        assembly {
            mstore(output, source)
            mstore(add(output, 16), source)
        }
        return (output[0], output[1]);
    }

    function convertToCoordinates(bytes32 input)
        public
        pure
        returns (int128 x, int128 y)
    {
        bytes16 xbytes;
        bytes16 ybytes;
        (xbytes, ybytes) = split(input);

        uint128 ux = uint128(xbytes);
        uint128 uy = uint128(ybytes);

        x = int128(ux);
        y = int128(uy);
    }

由于一种方法没有另一种方法是不太有用的,所以这里有一种相反的方法:

代码语言:javascript
复制
    function merge(bytes16 sourceA, bytes16 sourceB)
        public
        pure
        returns (bytes32)
    {
        return bytes32((uint256(uint128(sourceA)) << 128) | uint128(sourceB));
    }

    function convertFromCoordinates(int128 x, int128 y)
        public
        pure
        returns (bytes32 output)
    {
        return merge(bytes16(uint128(x)), bytes16(uint128(y)));
    }
票数 1
EN
页面原文内容由Ethereum提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

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

复制
相关文章

相似问题

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