Удалить конечный ноль из преобразования web3.toAscii()

У меня есть контракт, который возвращает переменную типа bytes32, и в настоящее время я тестирую ее с помощью трюфеля и javascript. Исходные данные

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

Этот массив - это то, что я получаю в ответ на свой контракт:

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

И это мой код

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

Использование метода web3.toAscii() для каждого элемента для получения удобной для человека строки приводит к следующему:

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

Есть ли способ удалить лишние символы, которые идут вместе с исходными данными?

Почему возвращается, bytes32а не string? (в этом случае вы можете просто избавиться от web3.toAsciiна стороне клиента).
потому что строки между контрактами не могут быть возвращены, и я пытаюсь найти способ передать данные, которые могут быть представлены в виде строк для конечного пользователя моего Dapp

Ответы (2)

web3.toUtf8()будет делать волшебство для вас

это используется в какой версии web3?
Я использовал это для web3 0.20.1, для web3 1.0.0-beta.26 с помощью web3.utils.hexToUtf8 решил это

За web3.toAsciiвас этого не сделают. Это исходный код ( ссылка ):

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

но никто не мешает вам создать собственную функцию для предотвращения такого поведения. Пример:

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 должен решить эту проблему, используя ссылкуweb3.utils.hexToUtf8

Так что я бы экспортировал это, а затем использовал в других моих файлах, верно?
или вы используете web3 1.0, в котором есть эта функцияweb3.utils.hexToUtf8