Solidity
Byte32 到 uint 然後返回到 byte32
我必須將兩個 uint128 值打包成一個 uint256,然後取回兩個原始 uint128。
要編碼我正在使用的值:
function encode256(uint128 a, uint128 b) pure public returns (uint256) { return uint256(bytes32(abi.encodePacked(a, b))); }
對於:
a=1, b=16
我們得到a=0x00000000000000000000000000000001
b=0x00000000000000000000000000000010
which 導致0x0000000000000000000000000000000100000000000000000000000000000010
uint256 的轉換是340282366920938463463374607431768211472
.問題是將其解碼回原件。為了將編碼解開
uint256
回兩個uint128
,我編寫了以下程式碼:let hex = numberToHex("340282366920938463463374607431768211472") //1 /16 hex = padRight(hex, 64) hex = hex.replace('0x','') const half = Math.ceil(hex.length / 2); const firstHalf = hex.slice(0, half) const secondHalf = hex.slice(half) console.log(firstHalf) console.log(secondHalf)
但出來的兩個數字是
a=10000000000000000000000000000001
,b=00000000000000000000000000000000
。我不確定編碼是如何發生的,並且想知道我在編碼或解碼過程中哪裡出錯了?
你是正確的。您實際上需要向左填充:
hex = padLeft(hex, 64)
如果轉換
340282366920938463463374607431768211472
為十六進制,它將是:100000000000000000000000000000010
. 如果我們離開它,它將是:0000000000000000000000000000000100000000000000000000000000000010
.切片第一部分時,它將是:
00000000000000000000000000000001
. 切片第二部分時,它將是:00000000000000000000000000000010
.這就是你想要的。