Memory
將字節轉換為 uint8888使用 mstore()
我知道如何轉換
bytes
為uint8[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; }
您可以找到有關該主題的整個庫: