我正致力于将代码从Python转换为Solidity,直到最后一个循环为止,一切都进行得很顺利。无法确定代码中的差异在哪里(除了十进制和十六进制编码中的字节)。以下是两种语言和输出的代码。
Python
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
坚固性
function test() public returns (bytes30 outs) {
bytes memory outmasks = hex"0c0b0c0e1708090907030605131306060406060009060d0e130207040000000c1708080a060e0e0904050605140b0c0b";
for (uint8 cnt = 0; cnt<48; cnt++) {
outs |= outmasks[cnt] << 5*cnt;
}
}0x6c0000000000000000000000000000000000000000000000000000000000
发布于 2018-11-27 10:36:00
这就是我想出来的:
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)。这就是为什么我有右班而不是左班的原因。
我希望你能跟上它。我匆匆忙忙做的。抱歉的
https://ethereum.stackexchange.com/questions/63082
复制相似问题