这道题,并不难,只是楼主,没有说清,是就字母移位吗?
但是看你的例子,有不全是。
程序如下:
#include <stdioh>
#include <stdlibh>
FILE source;//源文件
FILE destination;//目标文件
int key;//密钥
char file[100];//文件名
void encryption()//加密
{
char ch;
printf("请输入要加密的文件名\n");
scanf("%s",file);
if((source=fopen(file,"r"))==NULL)
{
printf("无法打开文件!\n");
exit(0);
}
printf("请输入加密后的文件名\n");
scanf("%s",file);
if((destination=fopen(file,"w"))==NULL)
{
printf("无法创建文件!\n");
exit(0);
}
printf("请输入密钥\n");
scanf("%d",&key);
ch=fgetc(source);
while(ch!=EOF)
{
if(ch=='\n')
{
fputc(ch,destination);
ch=fgetc(source);
continue;
}
ch+=key;
fputc(ch,destination);
ch=fgetc(source);
}
fclose(source);
fclose(destination);
}
void decrypt()//解密
{
char ch;
printf("请输入要解密的文件名\n");
scanf("%s",file);
if((source=fopen(file,"r"))==NULL)
{
printf("无法打开文件!\n");
exit(0);
}
printf("请输入加密后的文件名\n");
scanf("%s",file);
if((destination=fopen(file,"w"))==NULL)
{
printf("无法创建文件!\n");
exit(0);
}
printf("请输入密钥\n");
scanf("%d",&key);
ch=fgetc(source);
while(ch!=EOF)
{
if(ch=='\n')
{
fputc(ch,destination);
ch=fgetc(source);
continue;
}
ch-=key;
fputc(ch,destination);
ch=fgetc(source);
}
fclose(source);
fclose(destination);
}
int main()//主函数提供菜单
{
int choice=0;
printf("\n");
printf("1 文件加密\n");
printf("2 文件解密\n");
printf("3 退出\n");
printf("\n");
printf("请输入1 2 3选择 *** 作\n");
scanf("%d",&choice);
switch(choice)
{
case 1:encryption();break;
case 2:decrypt();break;
case 3:break;
}
return 0;
}
楼主大致思路是对的。
第一:移位程序是对的。
第二,失误在调用y=seqshift(x,n,3)返回量选择与stem(n,x)选择错误的横纵标量。
修订如下:
%赋初始序列
n=0:9;
x1=[(n-0)==0];
x2=2[(n-1)==0];
x3=3[(n-2)==0];
x4=4[(n-3)==0];
x5=5[(n-4)==0];
x=x1+x2+x3+x4+x5;
%画原始信号序列
subplot(2,1,1);
stem(n,x);
xlabel('n');
ylabel('x');
axis([0,12,0,5]);
title('x(n)');
%画移位序列
[y,ny]=seqshift(x,n,3);
subplot(2,1,2);
stem(ny,y);
xlabel('n');
ylabel('y');
axis([0,12,0,5]);
title('x(n-3)');
网速不给力,图就不粘上去了,自己运行下。
结果可详询qq814468671索要。
如果将该数值左移1位,就变成了 0b10101010(最右边这个0是移空了以后补的),这个数值是0xaa
从数学上看,左移1位等于乘以2,右移1位等于除以2,然后再取整,移位溢出的丢弃。
例如:
unsigned char a;
a=1; //0b00000001
a<<=1; //0b00000010 a左移1位等效于a=a2
a<<=2; //0b00001000 a左移2位等效于a=a2的2次方(4)
a<<=3; //0b01000000 a左移1位等效于a=a2的3次方(8)
a<<=1; //0b10000010 a左移1位等效于a=a2
a<<=1; //0b00000000 a再次左移1位后溢出了,结果变成0了
c=a<<b; 在变量都是8位的时候,等效于 c=(apow(2,b))%256
这个就是跑马灯程序嘛,你看看 我写的:
#include <REGX52H>
#include <intrinsH> 这个是调用单片机头文件里面的函数,你自己查查书籍啊,要调用的话就要写这个头文件 本程序 调用的移位函数啦 就是左右移动函数
#define uchar unsigned char
#define uint unsigned int
uchar aa ;
void delay(uint z ) //延时程序,延时准确为1MS;
{
uint x,y;
for(x=z;x>0;x--)
for(y=110;y>0;y--) ;
}
void main()
{
uint i,j;
while(1)
{
aa=0xfe;因为要亮一个灯撒 所以就是1111 1110呀 这就是0xfe的含义啊
for(i=8;i>0;i--) //左移程序
{
P2=aa;
delay(500) ;
aa=_crol_(aa,1);这个就是调用函数的使用方法,这个是左移动一位,意思是把aa左移一位 在赋值给aa哦,这样再P2=aa;不就把移动的数据传到P2口了吗,懂了吧
}
aa=0x7f;这个因要亮一个等 也是一样的道理0111 1111是吧 就是0x7f 啦
for(i=7;i>0;i--) //右移程序
{
P2=aa;
delay(500) ;
aa=_cror_(aa,1);这里用法还是与左移动一样的道理 ,
}
}
}
#include "Stdioh"
main()
{
int i,n,k;
int a[100],b[50]; /定义一个数组/
printf("please input n:\n");
scanf("%d",&n);
printf("please input %d numbers:\n",n);
for(i=0;i<n;i++)
scanf("%d",&a[i]);/给数组赋n个值/
printf("please input k:\n");
scanf("%d",&k);
for(i=n-k;i<n;i++)
b[i-n+k]=a[i];/将a数组后面k个元素移到b数组里面/
for(i=n-k-1;i>=0;i--)
a[i+k]=a[i];/数组开始右移/
for(i=0;i<k;i++)
a[i]=b[i];/数组b的元素放回数组a/
for(i=0;i<n;i++)
printf("%d, ",a[i]);
getch();
}
--------------
运行结果:
please input n:
6
please input 6 numbers:
10 20 30 40 50 60
please input k:
3
40,50,60,10,20,30,
以上就是关于C语言(文件的移位与加密解密)全部的内容,包括:C语言(文件的移位与加密解密)、matlab程序求教,编了一个移位的通用函数,但是运行了没效果,程序如下,求大神指教、想知道单片机》《移位符号的用法。想要实例就这个程序希望大家给一些解释。等相关内容解答,如果想了解更多相关内容,可以关注我们,你们的支持是我们更新的动力!
欢迎分享,转载请注明来源:内存溢出
评论列表(0条)