“ * p +++ c&63”在C ++中是什么意思?

scu*_*bbo 8 c

我是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));}
Run Code Online (Sandbox Code Playgroud)

(本文后面重新格式化以提高可读性)。

据我所知,这意味着要成为一个密码(“获取的每个字符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)
Run Code Online (Sandbox Code Playgroud)

但是结果输出的每一行大部分都是垃圾。

我想念什么?我是否已将(C ++)误译为(c=(*p+++c&63)+32Python)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)
  );}
Run Code Online (Sandbox Code Playgroud)

*包括但不限于main应返回的错误int,以及ISO C++11 does not allow conversion from string literal to 'char *'

eer*_*ika 7

*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));
}
Run Code Online (Sandbox Code Playgroud)

该字符串"25YZ[<TT];SR^2]W+%'C^,X-O?O&__V[!;TT];D+ #.A3,A+ 4C,$!_."可能是加密的文本。如果给定密钥作为参数,程序将对其解密。第一个参数的第一个字符用作键。

暴力破解密钥的程序:


 #include <stdio.h>
 int main() {
     for (char i = 0; i < 127; i++) {
         const char* p = "25YZ[<TT];SR^2]W+%'C^,X-O?O&__V[!;TT];D+ #.A3,A+ 4C,$!_.";
         printf("%c: ", i);
         for(char c = i;
             *p;
             putc(c=((*p++ + c) & 63) + 32, stdout));
         putc('\n', stdout);
     }
 }
 
Run Code Online (Sandbox Code Playgroud)


我想念什么?

  1. 运算符的顺序2.您假设键是字母数字。