Remix

“字節”可以作為十六進制取值嗎?

  • September 28, 2021

在嘗試在乙太坊上上傳公鑰時,我遇到了一個問題。

鑑於 Solidity 瀏覽器中的以下程式碼,我似乎只能插入string值(使用瀏覽器編譯器)。例如,當我“創建”和“設置”值為“0x1234”時,它會輸出:

“0x00000000000000000000000000000000000000000000000000000000000020000000000000000000000000000000000000000000000000000000000000000630783132333400000000000000000000000000000000000000000000000000”

我想要的是類似“0x1234”的東西,但它不是解釋為string. 解決方法是使用 bytesN 其中 N 是實際的字節數。但隨後它變成了靜態。有人可以幫忙嗎?

contract SimpleStorage {
   bytes storedData;
   function set(bytes x) {
       storedData = x;
   }
   function get() constant returns (bytes retVal) {
       return storedData;
   }
}

是的,代替上面的程式碼,我可以在將字節設置為bytes2. 然後我可以輸入“0x12”,它會輸出“0x12”。但是我可以在沒有靜態的情況下做到這一點嗎?

contract SimpleStorage
{
   bytes2 storedData;
   function set(bytes2 x) {
       storedData = x;
   }
   function get() constant returns (bytes2 retVal) {
       return storedData;
   }
}

嘗試使用 uint 代替:

contract Ballot {
uint public  key = 0x123A1; // A hex constant

}

你會得到:“0x00000000000000000000000000000000000000000000000000000000000123a1”

要使用十六進製字元串創建二進製文件,請使用web3.toAscii(); 並轉換回十六進制,使用web3.toHex(). 像這樣:

// 在 JavaScript 中
var txHash = simple.set(web3.toAscii("0x1234"), { from: account });
// 並檢索
var 返回 = simple.get().toHex();

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