题目:对图片1.bmp进行加密操作
图片:
解题步骤:
1、打开图片---open
#include <sys/types.h>
#include <sys/stat.h>
#include <fcntl.h>int open(const char *pathname, int flags);
int open(const char *pathname, int flags, mode_t mode);参数:
pathname:打开文件的文件名(包含路径)
flags:
O_RFONLY:表示以只读的方式打开文件
O_WWRONLY:以只写方式打开文件
O_RDWR:以读写的方式打开文件
O_CREAT:当文件不存在是,用该选项创建新文件,并用第三个参数为其设置权限
O_EXCL:用于检测指定文件是否存在,一般与O_CREAT联合使用
O_APPEND:以追加的方式打开文件,在文件末尾另起一行继续写入
O_TRUNC:打开文件之后,会将原文件清空返回值:
如果成功返回文件描述符,如果失败返回-1
2、读取图片的前十个字节---read
#include <unistd.h>
ssize_t read(int fd, void *buf, size_t count);
参数:
fd:读取文件的文件描述符
buf:用户自定义的缓冲区,存放准备读取的内容
count:请求读取的字节数(读取到的是实际的字节数)
返回值:
成功返回读到的字节数(int),失败返回-1,返回0表示读到文件末尾;
3、将读取的10个字节有序的打乱----字符串倒叙(头尾交换)
int i = 0;
int tmp = 0;
for(i = 0;i < 10/2; i++)
{
tmp = buf[i];
buf[i] = buf[9-i];
buf[9-i] = tmp;
}
4、将文件指针重新定位在文件开头
#include <sys/types.h>
#include <unistd.h>off_t lseek(int fd, off_t offset, int whence);
参数:
fd:文件描述符
offset:偏移量,可正可负,正往前,负往后
whence:
SEEK_SET:定位在文件开头
SEEK_CUR:定位在当前位置
SEEK_END:定位在文件末尾
返回值:
成功返回当前定位位置相对于文件开头的偏移量,失败返回-1
5、将打乱的10个字节写入函数---write
#include <unistd.h>
ssize_t write(int fd, void *buf, size_t count);
参数:
fd:读取文件的文件描述符
buf:用户自定义的缓冲区,存放准备写入的内容
count:请求写入的字节数
返回值:
成功返回读到的字节数(int),失败返回-1;
6、关闭文件--close
#include <unistd.h>
int close(int fd);
参数:
fd:要关闭的文件描述符
返回值:
成功返回0,失败返回-1;
程序代码如下:
#include <stdio.h>
#include <string.h>
#include <unistd.h>
#include <fcntl.h>
#include <sys/types.h>
#include <sys/stat.h>
int main(int argc, char *argv[])
{
char pic_name[64] = {0};
printf("请输入要加密的文件名:\n");
fgets(pic_name, 64, stdin);//从键盘上获取文件名
pic_name[strlen(pic_name)-1] = '\0';
int fd = open(pic_name, O_RDWR);//以读写的方式打开文件
if(fd < 0)
{
perror("open");
return -1;//文件打开失败
}
char buf[64] = {0};
int ret = read(fd, buf, 10);//从文件中读取十个字节
if(ret < 0)
{
perror("read");
return -1;//读取失败
}
int i; //对读取到的十个字节进行倒序操作
int tmp = 0;
for(i = 0;i <10/2; i++)
{
tmp = buf[i];
buf[i] = buf[9-i];
buf[9-i] = tmp;
}
ret = lseek(fd, 0, SEEK_SET);//将文件重新定位到开头
if(ret < 0)
{
perror("lseek");
return -1;
}
ret = write(fd, buf, 10); //写入倒序后的元素
if(ret < 0)
{
perror("write");//写入失败
return -1;
}
close(fd); //关闭文件
return 0;
}
运行结果如下:
结果:进行一次倒序后文件达到加密效果,再次运行程序,则能够还原图片。
图片加密有很多种方式,以上只是其中一种,欢迎大家留评讨论!