Что означает `* p +++ c & 63` в C ++? - PullRequest
8 голосов
/ 31 марта 2019

Я фанат игры 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 *'

1 Ответ

7 голосов
/ 31 марта 2019

Что означает *p+++c&63 в C ++?

  1. p++ Приращение постфикса.Увеличивает указатель p на следующий символ;результат - значение указателя до приращения.
  2. *p++ Направление.Через указатель приводит к результату выражения 1. Результатом является символ, на который изначально указывал p, то есть '2'.
  3. *p+++c сложение.Добавляет результат 2. и c.То же, что и *p++ + c
  4. *p+++c&63 Побитово и.Левый операнд - результат 3., а правый оператор - целочисленный литерал.

С полными круглыми скобками и разумным интервалом: (*(p++) + c) & 63


Здесь отформатированправильно сформированная версия, которая не выдает предупреждений:

#include <stdio.h>

int main(int, char**a) {
    const char* p = "25YZ[<TT];SR^2]W+%'C^,X-O?O&__V[!;TT];D+ #.A3,A+ 4C,$!_.";
    for(char c = a[1][0];
        *p;
        putc(c=((*p++ + c) & 63) + 32, stdout));
}

Строка "25YZ[<TT];SR^2]W+%'C^,X-O?O&__V[!;TT];D+ #.A3,A+ 4C,$!_.", вероятно, является зашифрованным текстом.Программа расшифровывает его, если ему дан ключ в качестве аргумента.Первый символ первого аргумента используется в качестве ключа.

Программа для грубой силы ключа:


Чего мне не хватает?

  1. Порядок операторов 2. Предполагается, что ключ буквенно-цифровой.
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...