Memory

將字節轉換為 uint8888使用 mstore()

  • February 15, 2022

我知道如何轉換bytesuint8[8]使用mload,但mstore似乎它可以更省油。

這樣的事情可能嗎?

function bytesToUintArray(bytes input) returns (uint8[8])) { 
   uint8[8] result;
   assembly {
       mstore(result, add(input, 32))
   }
   return result;
}

這似乎可行,但記憶體中的數組並不緊密,因此您需要多個 mstore

來自https://solidity.readthedocs.io/en/v0.4.20/assembly.html#conventions-in-solidity

Solidity 中記憶體數組中的元素總是佔用 32 字節的倍數(是的,對於 byte

$$ $$,但不適用於字節和字元串)。

function foo(bytes input) internal pure returns (uint8[8]) {
   uint8[8] memory result;
   assembly {
       let w := mload(add(input, 0x20))
       for { let i:= 0 } lt(i, 8) { i := add(i, 1) } {
           mstore(add(result, mul(i, 0x20)), byte(i, w))
       }
   }
   return result;
}

並且氣體消耗比明顯的解決方案略好

function foo2(bytes input) internal pure returns (uint8[8]) {
   uint8[8] memory result;
   for (uint i=0; i<8 && i<input.length; ++i) {
       result[i] = uint8(input[i]);
   }
   return result;
}

您可以找到有關該主題的整個庫:

https://github.com/pouladzade/Seriality

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