c - c中的凯撒密码表现出罕见的行为
问题描述
我在 c 中做一个凯撒密码来练习,我做了一个功能正常的密码;但它显示出一种奇怪的行为。代码如下:
#define lenght 18
char * caesar ( char * cyphertext, int key){
static char result [lenght];
for ( int i= 0; i < lenght ; i++){
result [i] =(char)(((int) cyphertext[i]) + key) % 255;
}
return result;
}
int main(){
char * text = caesar("Hola buenas tardes", 23 );
printf("%s \n" , text );
char * check = caesar( text , 256 - 23);
printf("%s \n" , check);
return 0;
}
加密后的版本是_x7y|x7x{|; 一个较短的数字;但是当我使用解密密钥运行第二个凯撒密码时,
它会毫无问题地将其解密为原始状态。我一直在环顾四周,可能是关于字符的存储方式。我将非常感谢任何帮助
解决方案
加密后的版本是_x7y|x7x{|; 一个较短的数字;
不,打印的是上面的内容。printf
或者更准确地说,这就是您的终端显示printf
打印内容的方式。如果您想确切地确定加密版本是什么,那么您应该在调试器中运行您的程序,并使用它来检查编码版本的字节。
您的方法会将可打印 ASCII 范围内的一些字符代码(十进制 32 - 126 代码)编码为该范围之外的代码。您的终端如何处理这些字节取决于您的配置和环境,但如果它需要 UTF-8 编码的数据,那么它将在输出中跳过无效的代码序列,如果它需要 ISO-8859 编码,那么一些输出代码将被解释为 C1 集中的控制字符。还有其他可能性。
通常,Caesar-cypher 程序会小心地将所有可打印字符映射到其他可打印字符,而忽略其他字符。典型的学术活动范围更窄,要求一个程序只映射大写和小写拉丁字母,保留大小写,而忽略所有其他(标点符号、数字、控制字符)。因此,这留作练习。
推荐阅读
- java - 构建 apk 和加载设备不起作用
- mysql - 将列日期时间值拆分为多列
- java - 递归查找二维数组中的单词
- element - vue-the-mask + element ui 输入槽 2 值错误
- translate - 将 MAGICAL 中的程序翻译成其他编程语言?
- linux - 读取(“拖尾”)一个巨大(>300GB)压缩文本文件的结尾
- sql - 如何使用 SQL 根据条件将多个单元格数据连接到一个单元格中
- api - 用于用户管理的 Shopify API
- linux - 无法使用 wget 下载文件
- c++ - 如果将函数返回值传递给函数引用参数,在 C++ 中会发生什么?