Entfernen Sie die nachgestellte Null aus der Umwandlung von web3.toAscii()

Ich habe einen Vertrag, der eine Variable vom Typ bytes32 zurückgibt, und ich teste ihn derzeit mit Trüffel und Javascript. Die Originaldaten

['Roberto', 'Juan', 'Andrea']

Dieses Array ist, was ich als Antwort von meinem Vertrag bekomme:

[ '0x526f626572746f00000000000000000000000000000000000000000000000000',
  '0x4a75616e00000000000000000000000000000000000000000000000000000000',
  '0x416e647265610000000000000000000000000000000000000000000000000000' ]

Und das ist mein Code

let cands = [];
let length = Number(await voting.candidateListLength());
for (let i = 0; i < length; i++)
    cands.push(web3.toAscii(await voting.candidateList(i)));
console.log(cands);

Die Verwendung der Methode web3.toAscii() für jedes Element, um eine benutzerfreundliche Zeichenfolge zu erhalten, erzeugt Folgendes:

[ 'Roberto\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000',
  'Juan\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000',
  'Andrea\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000' ]

Gibt es eine Möglichkeit, die zusätzlichen Zeichen zu entfernen, die mit den Originaldaten einhergehen?

Warum kehrt es zurück bytes32und nicht string? web3.toAscii(in diesem Fall könnten Sie das einfach auf der Client-Seite loswerden ).
weil Zeichenfolgen zwischen Verträgen nicht zurückgegeben werden können und ich versuche, einen Weg zu finden, Daten zu übergeben, die als Zeichenfolgen für den Endbenutzer meiner Dapp dargestellt werden können

Antworten (2)

web3.toUtf8()wird die Magie für Sie tun

wird das in welcher web3-version verwendet?
Ich habe dies für web3 0.20.1 verwendet, für web3 1.0.0-beta.26 mit web3.utils.hexToUtf8 wurde es gelöst

Das web3.toAsciiwird Ihnen nicht gelingen. Dies ist der Originalcode ( ref ):

var str = "";
var i = 0, l = hex.length;
if (hex.substring(0, 2) === '0x') {
  i = 2;
}
for (; i < l; i+=2) {
  var code = parseInt(hex.substr(i, 2), 16);
  str += String.fromCharCode(code);
}

aber niemand hindert Sie daran, Ihre eigene Funktion zu erstellen, um dieses Verhalten zu verhindern. Beispiel:

function toAscii(hex) {
  var str = "";
  var i = 0, l = hex.length;
  if (hex.substring(0, 2) === '0x') {
    i = 2;
  }
  for (; i < l; i+=2) {
    var code = parseInt(hex.substr(i, 2), 16);
    if(code != 0) {
      str += String.fromCharCode(code);
    }
  }

  return str;
}

web3 1.0 sollte dieses Problem beheben ref usingweb3.utils.hexToUtf8

Also würde ich das exportieren und dann in meinen anderen Dateien verwenden, oder?
oder Sie verwenden web3 1.0, das diese Funktion hatweb3.utils.hexToUtf8