Bytes
從記憶體中讀取超過 32 個字節(程序集)
假設我將變數字節(記憶體)傳遞給函式。此變數對應於與 B 連接的 A,其中 A 的大小為 32,B 為 96 字節,我如何返回 A(bytes32)和 B(bytes)。
function readData(bytes memory data) public returns (bytes32, bytes memory){ bytes32 A; bytes memory B; assembly{ A:= mload(add(data,0x20)) calldatacopy(B,0x45,0xA0) // not sure about this } return (A,B); }
編輯
知道 B 的長度使事情變得容易,但事情是 B 的大小可以改變,因此硬編碼一個序列
mload
(每個數據字一個)是行不通的。這可以通過組裝循環來解決,但我想知道是否有更有效的方法來做到這一點。
function readData (bytes memory data) public pure returns (bytes32 a, bytes memory b) { require (data.length == 0x80); assembly { a := mload (add (data, 0x20)) // A b := mload (0x40) // Free memory pointer mstore (0x40, add (b, 0x80)) // Advance free memory pointer mstore (b, 0x60) // B length mstore (add (b, 0x20), mload (add (data, 0x40))) // First word of B mstore (add (b, 0x40), mload (add (data, 0x60))) // Second word of B mstore (add (b, 0x60), mload (add (data, 0x80))) // Third word of B } }