Как вы смещаете байт на 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);
}
}