如何用int来固定一个字节?

时间:2017-12-22 17:45:33

标签: ethereum solidity smartcontracts ether

我目前正试图通过实体来抵消字节,以实现简单的凯撒密码解密。但是,我无法弄清楚如何做到这一点。这是我当前的代码,它在Remix中给出了一些编译器错误:

function decrypt(bytes32 data, int key) public returns (bool) {
    bytes32 decryptedData = data;    // `data` here is the encrypted data
    // decryption
    for (int i = 0; i < decryptedData.length; i++) {
        decryptedData[i] = (decryptedData[i] - key) % 256;
    }
    // returns if sha256(decryptedData) matches some value
}

然而,这给了我以下错误:

TypeError: Expression has to be an lvalue.
            decryptedData[i] = (decryptedData[i] - key) % 256;
            ^--------------^

TypeError: Operator - not compatible with types bytes1 and int256
           decryptedData[i] = (decryptedData[i] - key) % 256;
                               ^--------------------^

TypeError: Operator % not compatible with types bytes1 and int_const 256
           decryptedData[i] = (decryptedData[i] - key) % 256;
                              ^----------------------------^

谢谢!

1 个答案:

答案 0 :(得分:0)

像Damian Green说的那样,我对你尝试编写的算法感到有些困惑,但下面的合同将解密Caesar加密文本。您应该能够根据需要进行修改。 (请原谅懒惰的ASCII值硬编码)。

请注意,您不能使用bytes32,因为它在Solidity中被视为特殊数组,并且是只读的。请参阅&#34;索引访问&#34; http://solidity.readthedocs.io/en/develop/types.html#fixed-size-byte-arrays

的部分
pragma solidity ^0.4.17;

contract CaesarDecryption {
  function decrypt(bytes data, int key) pure public returns (bytes) {
      bytes memory decryptedData = data;

      for (uint i = 0; i < decryptedData.length; i++) {
          decryptedData[i] = decryptByte(decryptedData[i], key);
      }

      return decryptedData;
  }

  function decryptByte(byte b, int k) pure internal returns (byte) {
      uint8 ascii = uint8(b);
      uint8 asciiShift;

      if (ascii >= 65 && ascii <= 90)
        asciiShift = 65;
      else if (ascii >= 97 && ascii <=122)
        asciiShift = 97;

      return byte(((ascii - asciiShift - k + 26) % 26) + asciiShift);
  }
}