首页 > 解决方案 > `*p+++c&63` 在 C++ 中是什么意思?

问题描述

我是杀手游戏的粉丝,这是一款潜行暗杀游戏。

在最新挑战的动画中,我发现了以下类似代码的片段。我没有 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意思。我的猜测是它应该分解如下:

此外, 的初始值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=(*p+++c&63)+32将 (C++) 误译为 (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 *'

标签: c

解决方案


*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,$!_."可能是加密文本。如果给定密钥作为参数,程序将对其进行解密。第一个参数的第一个字符用作键。

暴力破解密钥的程序:


 #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);
     }
 }
 


我错过了什么?

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

推荐阅读