Solidity

Byte32 到 uint 然後返回到 byte32

  • September 24, 2022

我必須將兩個 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=0x00000000000000000000000000000010which 導致0x0000000000000000000000000000000100000000000000000000000000000010uint256 的轉換是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=10000000000000000000000000000001b=00000000000000000000000000000000

我不確定編碼是如何發生的,並且想知道我在編碼或解碼過程中哪裡出錯了?

你是正確的。您實際上需要向左填充:

hex = padLeft(hex, 64)

如果轉換 340282366920938463463374607431768211472為十六進制,它將是:100000000000000000000000000000010. 如果我們離開它,它將是:0000000000000000000000000000000100000000000000000000000000000010.

切片第一部分時,它將是:00000000000000000000000000000001. 切片第二部分時,它將是:00000000000000000000000000000010.

這就是你想要的。

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