Solidity

Solidity返回字元串不是十六進制?

  • August 30, 2016

目前我正在使用 ether.camp 來創建契約。在這個階段,它只是獲取和儲存一些值。但是,當我嘗試獲取它們以字節/十六進製表示的值時,即使返回類型是字元串?

如何將其轉換回solidity合約中的字元串?我試過如何將 bytes32 轉換為字元串但沒有運氣

例如儲存“Hello World!” 返回 0x0000000000000000000000000000000000000000000000000000000000000020000000000000000000000000000000000000000000000000000000000000000c48656c6c6f20576f726c64210000000000000000000000000000000000000000

  contract HelloWorld {
   struct Items {
      address id;
      string data;
   }

   mapping(address => Items) items;

   function getItem(address key) returns (string) {
     return items[key].data;
   }

   function addItem (address key, string data) returns (bool) {
       Items item = items[key];
       item.data = data;
   }

  }

}

我可以在 IDE 的 ethercamp 事務側欄中看到“Hello World!” 保存為字元串,但我getItem()無法檢索它?

使用web3.js 之類的contractInstance.getItem.call(key)

或將 getItem 標記為常量:function getItem(address key) constant returns (string)然後您可以使用:

contractInstance.getItem(key)

web3.js 會自動為你解碼字節。合約只有二進制數據,十六進制是查看該數據的更緊湊的方式,這就是您看到十六進制的原因。二進制數據也根據ABI進行編碼,因此可以區分值,例如數字和字元串之間的區別。

通常,您還可以使用:

> web3.toUtf8("0x48656c6c6f20576f726c64210000000000000000000000000000000000000000")
你好世界!

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