Solidity
Solidity返回字元串不是十六進制?
目前我正在使用 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") 你好世界!