Eliminar el cero final de la conversión web3.toAscii()

Tengo un contrato que devuelve una variable de tipo bytes32 y actualmente lo estoy probando con truffle y javascript. los datos originales

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

Esta matriz es lo que obtengo como respuesta de mi contrato:

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

Y este mi codigo

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

El uso del método web3.toAscii() en cada elemento para obtener una cadena amigable produce lo siguiente:

[ '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' ]

¿Hay alguna forma de eliminar los caracteres adicionales que vienen con los datos originales?

¿Por qué vuelve bytes32y no string? (en cuyo caso, podrías simplemente deshacerte del web3.toAsciilado del cliente).
porque no se pueden devolver cadenas entre contratos, y estoy tratando de encontrar una manera de pasar datos que puedan representarse como cadenas para el usuario final de mi Dapp

Respuestas (2)

web3.toUtf8()hará la magia por ti

¿Se usa eso en qué versión de web3?
Usé esto para web3 0.20.1, para web3 1.0.0-beta.26 usando web3.utils.hexToUtf8 lo resolvió

El web3.toAsciino hará eso por ti. Este es el código original ( 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);
}

pero nadie te impide crear tu propia función para evitar este comportamiento. Ejemplo:

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 debería solucionar este problema ref usandoweb3.utils.hexToUtf8

Entonces exportaría esto y luego lo usaría dentro de mis otros archivos, ¿verdad?
o usas web3 1.0 que tiene esta funciónweb3.utils.hexToUtf8