Bytes
此函式中變數“maxlength”的用途是什麼?
我想了解 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 並為自己節省一些氣體。