首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >位操作(python与solidity)

位操作(python与solidity)
EN

Ethereum用户
提问于 2018-11-27 01:06:17
回答 1查看 181关注 0票数 1

我正致力于将代码从Python转换为Solidity,直到最后一个循环为止,一切都进行得很顺利。无法确定代码中的差异在哪里(除了十进制和十六进制编码中的字节)。以下是两种语言和输出的代码。

Python

代码语言:javascript
复制
outmasks = bytes([12, 11, 12, 14, 23, 8, 9, 9, 7, 3, 6, 5, 19, 19, 6, 6, 4, 6, 6, 0, 9, 6, 13, 14, 19, 2, 7, 4, 0, 0, 0, 12, 23, 8, 8, 10, 6, 14, 14, 9, 4, 5, 6, 5, 20, 11, 12, 11])

for cnt in range(0x30):
    outs |= outmasks[cnt] << 5*cnt

print(hex(outs))

0x5b174298a44b9c6521176000021c53734c9018c431a73298674a5177316c

坚固性

代码语言:javascript
复制
function test() public returns (bytes30 outs) {

    bytes memory outmasks = hex"0c0b0c0e1708090907030605131306060406060009060d0e130207040000000c1708080a060e0e0904050605140b0c0b";


    for (uint8 cnt = 0; cnt<48; cnt++) {
        outs |= outmasks[cnt] << 5*cnt;
    }
}

0x6c0000000000000000000000000000000000000000000000000000000000

EN

回答 1

Ethereum用户

回答已采纳

发布于 2018-11-27 10:36:00

这就是我想出来的:

代码语言:javascript
复制
 function test() public returns (bytes30 outs) {

     bytes memory outmasks = hex"0c0b0c0e1708090907030605131306060406060009060d0e130207040000000c1708080a060e0e0904050605140b0c0b";

     for (uint8 cnt = 0; cnt<47; cnt++) {
         outs |= bytes30(outmasks[cnt]) >> (232 - 5 *cnt);
     }
     outs |= bytes30(outmasks[47]) << 3;
 }

现在的问题是:为什么?

您的解决方案从外部掩码数组中获取一个字节。你得到的是一个字节值!我们现在有两个案件:

  • cnt < 2:在字节范围内移动
  • cnt >= 2:您将值移出字节范围。这导致了outmasks[cnt] << 5*cnt = 0x00

这就是你得到0x6c0000000000000000000000000000000000000000000000000000000000的原因

现在有件事我觉得很奇怪,我无法解释为什么坚固会这样做。

如果将字节转换为byte30,则它将值设置为MSB。(例如:0x30 -> 0x300000000000000000000000000000000000000000000000000000000000)。这就是为什么我有右班而不是左班的原因。

我希望你能跟上它。我匆匆忙忙做的。抱歉的

票数 2
EN
页面原文内容由Ethereum提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

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

复制
相关文章

相似问题

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