c - `*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
意思。我的猜测是它应该分解如下:
*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=(*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 *'
解决方案
*p+++c&63
在 C++中是什么意思?
p++
后缀增量。增加指向p
下一个字符的指针;结果是递增前的指针值。*p++
间接的。通过表达式 1 的指针结果间接。结果是p
最初指向的字符,即'2'
.*p+++c
添加。添加 2. 和 . 的结果c
。如同*p++ + c
*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); } }
我错过了什么?
- 运算符的顺序 2. 您假设键是字母数字的。
推荐阅读
- python - 让 Enter 键的行为类似于 QTableWidget 中的 Tab
- angular - Angular 动画在 Firefox 中不起作用
- asp.net - 弹性 beantalk Web API 找不到文件
- java - STB loads image, but shows black texture
- tableau-api - Tableau:将单行变成多行
- python - excel删除现有条形图的数据框
- python - ImportError:没有安装了 2 个 Python 版本的名为“flask_sqlalchemy”的模块
- excel - 将 Access 查询导出到受密码保护的 Excel 工作簿
- python - python django AttributeError:'QuerySet'对象没有属性'region'
- ruby-on-rails - 没有资产管道的 Rails Active Storage