假设我有以下address:
0x9dd1e8169e76a9226b07ab9f85cc20a5e1ed44dd
我可以使用这个函数将它转换为一个bytes
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呢?
例如,这类函数签名:
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);
发布于 2017-03-31 23:18:32
如果您想要"0x9dd1e8169e76a9226b07ab9f85cc20a5e1ed“-它是160-16=144位(”44 16“== 16位)。函数addressToUint144将执行转换。
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));
}
}https://ethereum.stackexchange.com/questions/13792
复制相似问题