Javascript

字元串到字節錯誤

  • July 3, 2020

我正在嘗試獲取使用者輸入字元串並將它們轉換bytes32bytes5Solidity 5.11 中內置的契約,我分別嘗試了 32 和 5 個字元長的隨機字元串,但是它們不起作用,是否有 web3 的內置函式將字元串轉換為字節( 32 或 5) likeweb3.utils.fromAscii可用於從字元串生成適當的地址?

console.log(addressing("address");
console.log(bitify32("data"));
console.log(bitify5("key"));
function addressing(input) {
   let zeros = "0";  
   let input = web3.utils.fromAscii(input);
   if (input.length < 42) {
       let remainder = 32-input.length;
       for(let i = remainder-1; i > 0; i--) {
           zeros += "0";
       }
   }
   let inputZerod = input+zeros;
   return inputZerod;
}

function bytify32(input) {
   let zeros = "0";  
   let input = web3.utils.fromAscii(input);
   if (input.length < 32) {
       let remainder = 32-input.length;
       for(let i = remainder-1; i > 0; i--) {
           zeros += "0";
       }
   }
   let inputZerod = input+zeros;
   return inputZerod;
}
pragma solidity ^0.5.11;

contract bytesTest{

 mapping(address => BytesStruct) testBytes; 

    struct BytesStruct{
       address stringAddress;
      bytes32 string1;
      bytes5 string2;
    }


    function getByteStrings(address _stringAddress) view public returns(bytes32, bytes5){
        return(testBytes[_stringAddress].string1, testBytes[_stringAddress].string2);
    }


 function addByteString(address _stringAddress, bytes32 _string1, bytes5 _string2) public{
   testBytes[_stringAddress].string1 = _string1;
   testBytes[_stringAddress].string2 = _string2;

 }

}

我只是想了解為什麼 bytes32 和 5,如果每個字元都是一個字節,則分別需要長度為 66 和 11 的字元串

我將解釋bytes32

為了bytes32從 web3.js 發送到智能合約函式,您需要提供一個"0x"以 64 個十六進製字元開頭的字元串。

為什麼是64?因為每個字元代表4位(f-最高-代表1111)。

由於每個字節由 8 位組成,因此需要 64 個十六進製字元才能表示 32 個字節。

包括"0x"前綴,您會得到一個 66 個字元的字元串。

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