Solidity-Rückgabestring nicht hex?

Derzeit verwende ich ether.camp, um einen Vertrag zu erstellen. In diesem Stadium erhält und speichert es einfach einige Werte. Wenn ich jedoch versuche, die Werte in Bytes/Hex zu erhalten, obwohl der Rückgabetyp eine Zeichenfolge ist?

Wie konvertiere ich das im Soliditätsvertrag wieder in String? Ich habe versucht , wie man ein bytes32 in einen String konvertiert, aber kein Glück

ZB das Speichern von "Hello World!" kehrt zurück0x0000000000000000000000000000000000000000000000000000000000000020000000000000000000000000000000000000000000000000000000000000000c48656c6c6f20576f726c64210000000000000000000000000000000000000000

   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;
    }

   }

 }

Ich kann in der Seitenleiste der Ethercamp-Transaktionen der IDE das "Hello World!" wird als Zeichenfolge gespeichert, aber ich getItem()kann sie einfach nicht abrufen?

Antworten (2)

Verwenden Sie web3.js wie contractInstance.getItem.call(key).

Oder markieren Sie getItem als Konstante: function getItem(address key) constant returns (string)und dann können Sie Folgendes verwenden:

contractInstance.getItem(key)

web3.js decodiert die Bytes automatisch für Sie. Verträge haben nur binäre Daten, hex ist eine kompaktere Art, diese Daten anzuzeigen, und deshalb sehen Sie hex. Die binären Daten werden ebenfalls nach einem ABI kodiert , sodass Werte unterschieden werden können, beispielsweise zwischen einer reinen Zahl und einem String.

Vielen Dank! Hinzufügen constantlöst es, aber ich weiß, dass Webjs es automatisch für mich decodieren wird
Kein Problem. (Ich wollte mehr klarstellen, dass es nicht nötig ist, "dies im Soliditätsvertrag wieder in eine Zeichenfolge umzuwandeln", und gut, die Antwort funktioniert für Sie.)
Vielleicht verdient dies eine neue Frage, aber gibt es einen einfachen Einzeiler, um die Anzahl der Elemente im obigen Code zu ermitteln? Ich komme aus einem .net-Hintergrund, den ich hatte items.countoder items.lengthim Sinn hatte.
Nicht so, wie Ihr Code eingerichtet ist. Sie können eine Zuordnung nicht durchlaufen, aber wenn Sie ein Array von Adressen einbeziehen, können Sie die Länge davon leicht ermitteln.

Im Allgemeinen können Sie auch verwenden:

> web3.toUtf8 ("0x48656c6c6f20576f726c642100000000000000000000000000000000000000")
Hallo Welt!