Bytes
將 bytes16 轉換為 int128
我正在開發一個由情節組成的世界的分散式小遊戲。它有一個將位置連結到 Plot 結構的地圖。一個位置保存為一個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); }
這是一個解決方案:
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))); }