Bytes

此函式中變數“maxlength”的用途是什麼?

  • June 14, 2018

我想了解 Solidity 中的函式“appendUintToString”將 uint 連接成一個字元串? 該函式在下面重新創建。現在,我試圖了解整數“maxlength”的作用。

function appendUintToString(string inStr, uint v) constant returns (string str) {

   uint maxlength = 100;

   bytes memory reversed = new bytes(maxlength);
   uint i = 0;
   while (v != 0) {
       uint remainder = v % 10;
       v = v / 10;
       reversed[i++] = byte(48 + remainder);
   }
   bytes memory inStrb = bytes(inStr);
   bytes memory s = new bytes(inStrb.length + i);
   uint j;
   for (j = 0; j < inStrb.length; j++) {
       s[j] = inStrb[j];
   }
   for (j = 0; j < i; j++) {
       s[j + inStrb.length] = reversed[i - 1 - j];
   }
   str = string(s);
}

當我使用以下程式碼在 Remix 中將其隔離時,“reversed”的 getter 返回一個空的 0 插槽,但插槽中的數字與 maxlength 整數匹配。因此,當 maxlength = 20 時,returnBytes 返回 0x0000000000000000000000000000000000000000,如果 maxlength = 2,則返回 0x0000,以此類推。

這表明 maxlength 整數為可以用“反轉”表示的字節數提供了限制。然而,當我使用 changeBytes 函式設置“反轉”時,似乎沒有限制。例如,如果 maxlength = 2,它將允許我在此函式中輸入三個或更多,然後 getter 函式將返回三個或更多(它不會切斷額外的)。那麼最大值的意義何在?

uint public maxlength = 20;
bytes reversed = new bytes(maxlength);

function changeBytes(bytes _bytes) public {
reversed = _bytes;
}

function returnBytes() public view returns(bytes) {
return reversed;

}

在您的程式碼版本中,您只是在覆蓋reversed,所以所有要做maxlength的就是設置reversed呼叫之前changeBytes的時間。

在您引用的函式中,reversed字節maxlength長且永遠不會被覆蓋。(設置了單個字節,但數組是在頂部定義的。)

這是它期望整數具有的最大位數。由於您必須使用長度初始化字節數組,因此您需要提前指定。

但實際上,一個uint的最大值是115792089237316195423570985008687907853269984665640564039457584007913129639935,只有78位長。因此,您可能應該將 maxLength 設置為 78 並為自己節省一些氣體。

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