首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >有效地将地址转换为截断的uint128?

有效地将地址转换为截断的uint128?
EN

Ethereum用户
提问于 2017-03-31 22:06:49
回答 1查看 751关注 0票数 1

假设我有以下address

0x9dd1e8169e76a9226b07ab9f85cc20a5e1ed44dd

我可以使用这个函数将它转换为一个bytes

代码语言:javascript
复制
function toBytes(address a) public constant returns (bytes b){
    assembly{
      let m := mload(0x40)
      mstore(add(m,20),xor(0x140000000000000000000000000000000000000000,a))   //20 bytes in an address
      mstore(0x40,add(m,52))
      b := m
    }
  }

效果很好!

但是,我如何才能得到地址的最后128位并返回一个uint128呢?

例如,这类函数签名:

代码语言:javascript
复制
function toUint128(address a) public constant returns (uint128 u){
    assembly{
      let m := mload(0x40)
      //what goes here??
      //??
      //??
      //mstore(add(m,20),xor(0x140000000000000000000000000000000000000000,a))
      //mstore(0x40,add(m,52))
      u := m
    }
  }

我要uint128等效的"0x9dd1e8169e76a9226b07ab9f85cc20a5e1ed",其中删除最后4个十六进制字符(“44 32”,32位)。这是一个160位数减去32位= 128位数。

编辑:

这其实很简单,你要做的就是:

uint160 x=uint160(myAddress);

EN

回答 1

Ethereum用户

回答已采纳

发布于 2017-03-31 23:18:32

如果您想要"0x9dd1e8169e76a9226b07ab9f85cc20a5e1ed“-它是160-16=144位(”44 16“== 16位)。函数addressToUint144将执行转换。

代码语言:javascript
复制
contract AddressToUint144
{
    address public constant example_addr=0x9dd1e8169e76a9226b07ab9f85cc20a5e1ed44dd;

    function addressToUint144(address addr) constant
    returns (uint144)
    {
        return uint144(bytes20(addr)>>16);
    }

    //Converting to bytes18 only for good visualization in Remix
    function test()
    returns (bytes18)
    {
        return bytes18(addressToUint144(example_addr));
    }
}
票数 1
EN
页面原文内容由Ethereum提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://ethereum.stackexchange.com/questions/13792

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档