Bytes

從記憶體中讀取超過 32 個字節(程序集)

  • March 19, 2019

假設我將變數字節(記憶體)傳遞給函式。此變數對應於與 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
 }
}

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