用C语言中加密文件疑问?
#include<stdio.h>intmain(){charch;while((ch=getchar())!='\n'){if((ch>='a'&&ch<='z')||...
#include <stdio.h>
int main ()
{
char ch;
while ((ch=getchar())!='\n')
{
if ((ch>='a'&&ch<='z')||(ch>='A'&&ch<='z'))
{
ch=ch-8;
if ((ch<'a'&&ch>='a'-8)||ch<'A') //这个代码是什么意思?请大侠详解!!!
ch=ch+26;
}
putchar (ch);
}
while ((ch=getchar())!='\n')
putchar (ch);
putchar ('\n');
}
上面这个代码想了很长时间,请大侠指点一下!!! 展开
int main ()
{
char ch;
while ((ch=getchar())!='\n')
{
if ((ch>='a'&&ch<='z')||(ch>='A'&&ch<='z'))
{
ch=ch-8;
if ((ch<'a'&&ch>='a'-8)||ch<'A') //这个代码是什么意思?请大侠详解!!!
ch=ch+26;
}
putchar (ch);
}
while ((ch=getchar())!='\n')
putchar (ch);
putchar ('\n');
}
上面这个代码想了很长时间,请大侠指点一下!!! 展开
4个回答
展开全部
因为字母对应的ascII码a-z为65-90, A-Z为97-122。这段代码的意思是将每个字母向后移8位即i(73)变为a(65),j(74)变为b(66),k(75)变为c(67)...,
回到你的问题,每个字母都递减会出现这样的问题:假如你输入的是b对应的ascII码为66,再减8就是58了,没有字母的ascII码为58(对应的符号为‘:’),这就会出现乱码。依次类推所有65+8=73和97+8=103以下的字母加密之后都是乱码形式出现的。为了避免这种情况,加了一个循环即26,这样例子中的b加密之后会变成66-8+26=84 即t。这样就能保证即使是加密,加密出来的字符也是在字母范围之内的
回到你的问题,每个字母都递减会出现这样的问题:假如你输入的是b对应的ascII码为66,再减8就是58了,没有字母的ascII码为58(对应的符号为‘:’),这就会出现乱码。依次类推所有65+8=73和97+8=103以下的字母加密之后都是乱码形式出现的。为了避免这种情况,加了一个循环即26,这样例子中的b加密之后会变成66-8+26=84 即t。这样就能保证即使是加密,加密出来的字符也是在字母范围之内的
展开全部
加密我不太懂,不过按照文件读写的顺序,我认为应该是:
1、询问要加密的文件。
2、根据文件名,打开文件。
3、往内存里读入文件内容,也就是在程序中用临时变量来接收这些内容。
4、用加密算法,处理那些从文件读取出来的数据。
5、把处理好的内容再重新写进目标文件。
这是文件加密步骤。
不过如果你的意思仅仅是给文件加个密码的话。。。。
fread和fwrite 一般用于二进制文件读写,因为它们的特性是按照“块”做单位来读写的,不需要考虑存储内容的格式(因为在内存中,无论是文本数据还是二进制数据,它们存储的都是二进制,这是内存存储的本质,明白这个很关键),而按“块”来读写,说的是按字节数来读写。
fprintf和fscanf,一般用于存储有格式要求的数据。比如说存储一个结构体,里面有整形和字符型等等。
需要补充的是,因为本质上,任何数据在内存里存储的形式都是二进制,所以像结构体这类自定义类型,也可以用fread和fwrite来读写,而这个“块”单位一般等于sizeof(struct)。
用fwrite存储二进制文件,用记事本打开是乱码,看起来不直观;用fprintf存储文本文件,用记事本打开是一般文字,很直观看得懂。所以一般练习都喜欢用fprintf。
这个问题可能不太好理解。不懂再追问呗。
是否可以解决您的问题?
1、询问要加密的文件。
2、根据文件名,打开文件。
3、往内存里读入文件内容,也就是在程序中用临时变量来接收这些内容。
4、用加密算法,处理那些从文件读取出来的数据。
5、把处理好的内容再重新写进目标文件。
这是文件加密步骤。
不过如果你的意思仅仅是给文件加个密码的话。。。。
fread和fwrite 一般用于二进制文件读写,因为它们的特性是按照“块”做单位来读写的,不需要考虑存储内容的格式(因为在内存中,无论是文本数据还是二进制数据,它们存储的都是二进制,这是内存存储的本质,明白这个很关键),而按“块”来读写,说的是按字节数来读写。
fprintf和fscanf,一般用于存储有格式要求的数据。比如说存储一个结构体,里面有整形和字符型等等。
需要补充的是,因为本质上,任何数据在内存里存储的形式都是二进制,所以像结构体这类自定义类型,也可以用fread和fwrite来读写,而这个“块”单位一般等于sizeof(struct)。
用fwrite存储二进制文件,用记事本打开是乱码,看起来不直观;用fprintf存储文本文件,用记事本打开是一般文字,很直观看得懂。所以一般练习都喜欢用fprintf。
这个问题可能不太好理解。不懂再追问呗。
是否可以解决您的问题?
已赞过
已踩过<
评论
收起
你对这个回答的评价是?
展开全部
if ((ch>='a'&&ch<='z')||(ch>='A'&&ch<='Z')) //这里是判断字符ch是大、小写字母,你的第二个z写成了小写,应该大写
{
ch=ch-8; //对该字母做减8处理
if ( (ch<'a'&&ch>='a'-8) || ch<'A' ) //对于前8个字母'a'-'h'| 'A'-'H'减8后,将不在大小写字母区间内,所以,会出现小于'a' 或小于'A'的情况,而达不到保持字母的模样,因此,对其进行加26的处理,让其对应到后8个字母的位置。
ch=ch+26;
}
本回答被提问者和网友采纳
已赞过
已踩过<
评论
收起
你对这个回答的评价是?
推荐律师服务:
若未解决您的问题,请您详细描述您的问题,通过百度律临进行免费专业咨询