我正在做一个分散的游戏,一个由情节组成的世界。它有一张地图,它将一个位置与一个地块结构连接起来。一个位置被保存为一个bytes16,但是表示两个int64 (坐标可以是负的,中心在0,0)。如何将它们转换为int64 (似乎只能将它们转换为uint64)?
以下是我尝试过的:
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);
}发布于 2021-10-26 16:02:15
以下是一个解决方案:
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);
}由于一种方法没有另一种方法是不太有用的,所以这里有一种相反的方法:
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)));
}https://ethereum.stackexchange.com/questions/112134
复制相似问题