Solidity
如何將任意字節傳遞給 Remix (2017) 中的函式
根據這個問題,我可以寫一個簡單的契約,如:
contract SimpleStorage { bytes input; function setInput(bytes enterBytes){ input = enterBytes; } }
在 Remix 中使用“0x1234”作為參數“不起作用”並將“0x307831323334”儲存在儲存陣列中。如果我將程式碼更改為,
bytes2
那麼所有內容都可以使用相同的命令按預期工作。我怎樣才能使用動態數組來做同樣的事情?contract SimpleStorage { bytes2 input; function setInput(bytes2 enterBytes){ input = enterBytes; } }
- 您可以在 Remix 或 browser-solidity 中將字節參數作為單字節數組傳遞,例如**$$ “0x00”,“0xaa”, “0xff” $$**相當於 “0x00aaff”
- 不知道為什麼,但是 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; } }