文件IO实现图片的加密操作

目录

1、什么是文件IO

2、什么是文件描述符

3、文件相关系统调用函数

(1)打开关闭文件

文件打开open():

文件关闭close()

(2)读写文件

读文件read()

写文件write()

(3)文件定位

4、文件IO实现图片加密

5、代码实现

6、运行结果


1、什么是文件IO

        文件IO看似高级,实则与标准IO相比,文件IO操作更加简单,内部函数也较为容易理解。
        文件IO遵循POSIX标准,文件IO实际上使用的是系统调用函数,标准IO适用于操作普通文件,而文件IO则适用于操作任意类型的文件。

        标准IO的操作是通过文件指针的形式来访问文件的内容,而文件IO则是通过特定的文件描述符来进行文件的相关操作。

2、什么是文件描述符

        文件描述符是一个按顺序分配的最小的非负整数,当用户打开或者新建文件时,系统会向当前进程返回一个最小的可用的文件描述符

        

        C语言在打开C文件时会默认调用标准输入(stdin)、标准输出(stdout)和标准错误(stderr),因此这三者对应的文件描述符依次为:

        标准输入——0

        标准输出——1

        标准错误——2

        如果此时用户使用文件IO打开一个文件或者目录A,那么此时该文件或者目录A对应的文件描述符就是3。

        如果我们此时关闭标注错误对应的文件或者目录,那么此时存在的文件描述符为:

        标注输入——0

        标注输出——1

        文件或者目录A——3

        此时若再打开一个文件或者目录,那么这时候分配的文件描述符将为2

3、文件相关系统调用函数

(1)打开关闭文件

文件打开open():

头文件:

               #include <sys/types.h>
               #include <sys/stat.h>
               #include <fcntl.h>

open函数原型:

               int open(const char *pathname, int flags);
               int open(const char *pathname, int flags, mode_t mode);

         

参数:
            pathname:打开文件的文件名(包含路径)
            flags:打开文件的方式(当需要输入多个参数时用|隔开)
                        O_RDONLY:以只读方式打开文件
                        O_WRONLY:以只写方式打开文件
                        O_RDWR:以读写方式打开文件
                        以上三个选项必须选一个进行操作
    
                        O_CREAT:当打开文件不存在时,用该选项创建新文件,并用第三个参数为其设置权限
                        O_EXCL:一般和O_CREAT联合使用,用于检测文件是否存在
                        O_APPEND:以追加方式打开文件,在文件末尾另起一行继续写入
                        O_TRUNC:打开文件之后会将原文件清空
    
    
            mode:
                        当需要创建新文件时,需要用该参数给新建文件设置初始权限,一般设置为0664
    
            
返回值:
                        成功返回文件描述符,失败返回-1;

文件关闭close()

头文件:

        #include <unistd.h>

函数原型:

        int close(int fp);


参数:
        fd:要关闭的文件描述符


返回值:
       成功返回0,失败返回-1    

(2)读写文件

读文件read()

头文件:

        #include <unistd.h>

函数原型:

        ssize_t read(int fd, void *buf, size_t count);

参数:

        fd:读取文件的文件描述符
        buf:用户自定义的缓冲区,用于存放读取的内容
        count:要读取的字节数

返回值(int类型):
        成功返回读到的字节数,失败返回-1, 读取到文件末尾返回0;

写文件write()

头文件:

        #include <unistd.h>

函数原型:
        ssize_t write(int fd, void *buf, size_t count);

参数:

        fd:写入文件的文件描述符
        buf:用户自定义的缓冲区,用于存放要写入的内容
        count:要写入的字节数

返回值(int类型):
        成功返回读到的字节数,失败返回-1

(3)文件定位

头文件:

        #include <sys/types.h>
        #include <unistd.h>

函数原型:

        off_t lseek(int fd, off_t offset, int whence);

参数:

        fd:文件描述符

        offset:偏移量

        whence:

                SEEK_SET————文件开头
                SEEF_CUR————当前位置;
                SEEK_END————文件末尾;


返回值:

        成功返回当前文件定位位置相对于文件开头的偏移量,失败返回-1

4、文件IO实现图片加密

        不管在什么操作系统中,文件存储方式都是按照字节数来存放的,我们只需要对改文件的二进制文件进行简单的操作,就可以实现加密、马赛克等操作。

        对于加密文件来说,我们希望可以不修改图片的具体信息,这时候,我们可以通过操作文件的格式头来进行文件的加密,由于问价的格式头没有存储图像信息,所以修改格式头不会使图像本身信息变动,将格式头改回来之后依旧可以进行查看。

        在不同格式的文件中,文件的格式头所占的字节数不同。

        我们以以下图片为操作对象,将其命名为1.png

         由于PNG的图片格式头由13个字节组成,所以我们在操作文件数据时只需要操作文件开头到后面的13个字节的数据。

        因此这里我们选择将PNG文件的前13个字节进行逆序,这样操作有利于后续的解密操作等。

5、代码实现

/*===============================================================
 *   Copyright (C) 2022 All rights reserved.
 *   
 *   文件名称:picture.c
 *   创 建 者:QiuCC
 *   创建日期:2022年08月05日
 *   描    述:
 *
 *   更新日志:
 *
 ================================================================*/
#include <stdio.h>
#include <string.h>
#include <stdlib.h>
#include <strings.h>
#include <sys/types.h>
#include <sys/stat.h>
#include <fcntl.h>
#include <unistd.h>
#define N 100
#define num 13

int main(int argc, char *argv[])
{
	int fd = open(argv[1], O_RDWR);
	if(fd < 0){
		perror("open argv[1]");
		return -1;
	}

	char buf[N] = {0};

	int ret = read(fd, buf, num);
	if(ret < 0){
		perror("read argv[1]");
		return -1;
	}
	printf("num = %d\n", num);
	puts(buf);
	int i = 0, j = ret - 1;
	while(i < j){
		char tmp;
		tmp = buf[j];
		buf[j] = buf[i];
		buf[i] = tmp;
		i++;
		j--;
	}
	puts(buf);

	lseek(fd, 0, SEEK_SET);

	ret = write(fd, buf, num);
	if(ret < 0){
		perror("write argv[1]");
		return -1;
	}
	
	close(fd);

	printf("successful\n");


	return 0;
}

        由于我们使用的操作环境是linux,使用的开发工具为vim,所以我们操作argv[]来实现文件名的输入。

6、运行结果

 

 

         以上结果显示,我们第一次运行后文件无法显示,再次运行后,问件又可以显示信息,这证明我们的操作是正确的。

        如果需要设置密码,也可以在此基础上继续改进哦!!!

        以上就是本期内容,欢迎大家参考指正!!!

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

玖尾猫

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值