Как вы смещаете байт на int в солидности?

В настоящее время я пытаюсь сместить байты в надежности, чтобы реализовать простое шифрование Цезаря. Тем не менее, я не могу понять, как это сделать. Вот мой текущий код, который дает несколько ошибок компилятора в 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 ответ

Как сказал Дамиан Грин, я немного запутался в алгоритме, который вы пытаетесь написать, но контракт ниже расшифрует зашифрованный Цезаром текст. Вы должны быть в состоянии изменить его для своих нужд. (Пожалуйста, извините за ленивое жесткое кодирование значений ASCII).

Обратите внимание, что вы не можете использовать bytes32 как это рассматривается как специальный массив в Solidity и только для чтения. См. Раздел "Доступ к индексу" в http://solidity.readthedocs.io/en/develop/types.html.

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);
  }
}
Другие вопросы по тегам