Bytes

將 bytes16 轉換為 int128

  • October 28, 2021

我正在開發一個由情節組成的世界的分散式小遊戲。它有一個將位置連結到 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)));
   }

引用自:https://ethereum.stackexchange.com/questions/112134