Web3js

從 web3.toAscii() 轉換中刪除尾隨零

  • May 8, 2018

我有一個返回 bytes32 類型變數的契約,我目前正在使用 truffle 和 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' ]

有沒有辦法刪除原始數據附帶的額外字元?

web3.toUtf8()會為你施展魔法

web3.toAscii不會為你這樣做。這是原始程式碼(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);
}

但沒有人阻止你創建自己的函式來防止這種行為。例子:

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

引用自:https://ethereum.stackexchange.com/questions/47881