Solidity

如何將任意字節傳遞給 Remix (2017) 中的函式

  • January 24, 2022

根據這個問題,我可以寫一個簡單的契約,如:

contract SimpleStorage {
 bytes input;
 function setInput(bytes enterBytes){
   input = enterBytes;
 }
}

在 Remix 中使用“0x1234”作為參數“不起作用”並將“0x307831323334”儲存在儲存陣列中。如果我將程式碼更改為,bytes2那麼所有內容都可以使用相同的命令按預期工作。我怎樣才能使用動態數組來做同樣的事情?

contract SimpleStorage {
 bytes2 input;
 function setInput(bytes2 enterBytes){
   input = enterBytes;
 }
}
  1. 您可以在 Remix 或 browser-solidity 中將字節參數作為單字節數組傳遞,例如**$$ “0x00”,“0xaa”, “0xff” $$**相當於 “0x00aaff”
  2. 不知道為什麼,但是 Remix IDE 和 browser-solidity 將“0xaabb11 …”解釋為字元串。對於私有或測試網路的開發和測試目的,您可以使用下面的程式碼。函式hexStrToBytes將進行轉換。您可以使用它的結果,如 setInputFromHex 函式所示

程式碼:

contract SimpleStorage 
{
   bytes input;

   function setInput(bytes enterBytes){
       input = enterBytes;
   }

   function getInput()
   returns (bytes)
   {
       return input;
   }

   function setInputFromHex(string hex_str)
   {
       input = hexStrToBytes(hex_str);
   }

   function hexStrToBytes(string hex_str) constant
   returns (bytes)
   {
       //Check hex string is valid
       if (bytes(hex_str)[0]!='0' ||
           bytes(hex_str)[1]!='x' ||
           bytes(hex_str).length%2!=0 ||
           bytes(hex_str).length<4)
           {
               throw;
           }

       bytes memory bytes_array = new bytes((bytes(hex_str).length-2)/2);

       for (uint i=2;i<bytes(hex_str).length;i+=2)
       {
           uint tetrad1=16;
           uint tetrad2=16;

           //left digit
           if (uint(bytes(hex_str)[i])>=48 &&uint(bytes(hex_str)[i])<=57)
               tetrad1=uint(bytes(hex_str)[i])-48;

           //right digit
           if (uint(bytes(hex_str)[i+1])>=48 &&uint(bytes(hex_str)[i+1])<=57)
               tetrad2=uint(bytes(hex_str)[i+1])-48;

           //left A->F
           if (uint(bytes(hex_str)[i])>=65 &&uint(bytes(hex_str)[i])<=70)
               tetrad1=uint(bytes(hex_str)[i])-65+10;

           //right A->F
           if (uint(bytes(hex_str)[i+1])>=65 &&uint(bytes(hex_str)[i+1])<=70)
               tetrad2=uint(bytes(hex_str)[i+1])-65+10;

           //left a->f
           if (uint(bytes(hex_str)[i])>=97 &&uint(bytes(hex_str)[i])<=102)
               tetrad1=uint(bytes(hex_str)[i])-97+10;

           //right a->f
           if (uint(bytes(hex_str)[i+1])>=97 &&uint(bytes(hex_str)[i+1])<=102)
               tetrad2=uint(bytes(hex_str)[i+1])-97+10;

           //Check all symbols are allowed
           if (tetrad1==16 || tetrad2==16)
               throw;

           bytes_array[i/2-1]=byte(16*tetrad1+tetrad2);
       }

       return bytes_array;
   }
}

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