Я фанат игры Hitman , игры в жанре стелс-экшн.
В фильме о последнем вызове я заметил , следующий за кодомсниппет .У меня нет опыта работы с C ++ и C-инструментов, установленных в моей системе, поэтому я попытался скопировать его в REPL здесь , но постоянно получал ошибки *
Вот моя транскрипция кода:
#include<stdio.h>
void main(int,char**a){for(char*p="25YZ[<TT];SR^2]W+%'C^,X-0?0&__V[!;TT];D+ #.A3,A+ 4C,$!_.",c=a[1][0];*p;putc(c=(*p+++c&63)+32,stdout));}
(переформатирован для удобства чтения далее в этом посте).
Насколько я могу судить, это означает, что это шифр ("взять каждый символ cipher
,пройти через преобразование и распечатать его "), но я не могу ни заставить это выполнить, ни понять это достаточно, чтобы перевести это на язык, который я знаю как Python: у меня есть нет понятия, что *p+++c&63
означает.Я думаю, что это должно быть разбито следующим образом:
*p++
- взять следующий символ *p
... +
- ... идобавить его (целочисленное представление) к ... c
- ... ранее установленному значению c
(либо из предыдущей итерации цикла, либо из инициализации как c=a[1][0]
) ... &63
- ... что-то делать?Выглядит как побитовый оператор ? +32
- добавьте 32 к результату
Кроме того, начальное значение a
выглядит следующим образом:ключ дешифрования - но я просмотрел оставшуюся часть видео и не могу найти никаких подсказок относительно того, каким он должен быть.
Я пытался перевести это на Python (перебирая все буквы и цифрыкак ключ) следующим образом:
import string
cipher = "25YZ[<TT];SR^2]W+%'C^,X-0?0&__V[!;TT];D+ #.A3,A+ 4C,$!_."
def printout(c):
plaintext = ""
for p in cipher:
c = chr(ord(p) + ((ord(c) & 63)) + 32)
plaintext += c
print(plaintext)
for c in string.letters + string.digits:
printout(c)
Но каждая строка в результате вывода в основном мусор.
Чего мне не хватает?Я неправильно перевел (C ++) c=(*p+++c&63)+32
в (Python) c = chr(ord(p) + ((ord(c) & 63)) + 32)
(в цикле for, продвигая p
к следующему символу), или мне просто нужно привести свою сеть шире для ключа дешифрования?
Немного переформатировал исходный код для удобства чтения:
#include<stdio.h>
void main(int,char**a) {
for(
char*p="25YZ[<TT];SR^2]W+%'C^,X-0?0&__V[!;TT];D+ #.A3,A+ 4C,$!_.",
c=a[1][0];
*p;
putc(c=(*p+++c&63)+32,stdout)
);}
*, включая, но не ограничиваясь, ошибку, которую main
должен вернуть int
, и что ISO C++11 does not allow conversion from string literal to 'char *'