总结C语言在嵌入式开发中应用的知识点(文件数据的加密与解密)

本文涉及的产品
密钥管理服务KMS,1000个密钥,100个凭据,1个月
简介:

<span style="font-family: Arial, Helvetica, sans-serif; background-color: rgb(255, 255, 255);">     好几天没写总结了,因为最近特别特别忙,各种驱动的代码都要我去改去测试,我主要最近主要是在搞驱动中数据,文件加密解密这块,就这块内容,便运用到了C语言最核心的两个知识点---数组和指针。</span>


 加密数据和文件为什么要用到指针和数组?

         首先你要打开一个文件,那么在标准C中,你可以定义一个文件描述符,标准C语言提供了fopen ,fread,fwrite,fseek等等的一些操作文件的接口,我们不妨来看看,这些接口到底是怎么使用的。

 

函数原型FILE * fopen(const char * path,const char *mode);

返回值:文件顺利打开后,向该流的文件指针就会被返回。如果文件打开失败则返回NULL,并把错误代码存在errno中。

一般而言,打开文件后会做一些文件读取或写入的动作,若打开文件失败,接下来的读写动作也无法顺利进行,所以一般在fopen()后作错误判断及处理。

mode有下列几种形态字符串:

r 只读方式打开文件,该文件必须存在。

r+ 以可读写方式打开文件,该文件必须存在。

w 打开只写文件,若文件存在则文件长度清为0,即该文件内容会消失。若文件不存在则建立该文件。

等等….

废话不多说,上代码:

#include<stdio.h>
//定义一个文件的路径
#define F_PATH "d:\\myfile\\file.dat"
int main(void)
{
    FILE*fp=NULL;//需要注意,最好初始化为空,因为文件流也是指针
    fp=fopen(F_PATH,"r");//以只读方式打开
    if(NULL==fp)
    {
        return -1;//要返回错误代码
    }
    fclose(fp);//关闭文件描述符
    fp=NULL;//需要指向空,否则会指向原打开文件地址
    
     return 0;
}

打开方式总结:各种打开方式主要有三个方面的区别:

打开是否为二进制文件,用“b”标识。

读写的方式,有以下几种:只读、只写、读写、追加只写、追加读写这几种方式。

对文件是否必须存在、以及存在时是清空还是追加会有不同的响应。

 

当然,我只是举了一个最简单的例子,如果你有兴趣,慢慢去尝试。

以下是linux系统编程的open 打开文件的操作:

#include<unistd.h>
#include<sys/types.h>
#include<sys/stat.h>
#include<fcntl.h>
int main()
{
   int fd,size;
   char s [ ]=”Linux Programmer!\n”,buffer[80];
   fd=open(“/tmp/temp”,O_WRONLY|O_CREAT);
   write(fd,s,sizeof(s));
close(fd);
   fd=open(“/tmp/temp”,O_RDONLY);
  size=read(fd,buffer,sizeof(buffer));
  close(fd);
  printf(“%s”,buffer);
}


在UNIX系统编程中,打开文件还可以用open这个函数,具体怎么用自己百度!!要养成看函数的习惯,看多了自然就会了,其实这么厚一本,6-7百页,等你会了10个,那6-7百页的东西就都会了,只是函数而已嘛,拿来用就行了,至于会不会用,那要问问你自己C语言学得怎么样,还有对操作系统的理解程度怎么样。

以上说的是打开文件的一些简单操作,当然还有读,写,偏移等等。

函数原型:

size_t fread(void *buffer, size_t size, size_t count, FILE *stream);

buffer

用于接收数据的内存地址

size

要读的每个数据项的字节数,单位是字节

count

要读count个数据项,每个数据项size个字节.

stream

输入流

返回值:实际读取的元素个数。如果返回值与count不相同,则可能文件结尾或发生错误。从ferrorfeof获取错误信息或检测是否到达文件结尾。

写:size_t fwrite(const void* buffer, size_t size, size_tcount, FILE* stream);

注意:这个函数以二进制形式对文件进行操作,不局限于文本文件

返回值:返回实际写入的数据块数目

1buffer:是一个指针,对fwrite来说,是要获取数据的地址;

2size:要写入内容的单字节数;

3count:要进行写入size字节的数据项的个数;

4stream:目标文件指针

5)返回实际写入的数据项个数count

偏移:

int fseek(FILE *stream, long offset, int fromwhere);

函数设置文件指针stream的位置。如果执行成功,stream将指向以fromwhere(偏移起始位置:文件头0(SEEK_SET),当前位置1(SEEK_CUR),文件尾2(SEEK_END))为基准,偏移offset指针偏移量)个字节的位置。如果执行失败(比如offset超过文件自身大小),则不改变stream指向的位置。

返回值: 成功,返回0,失败返回-1,并设置errno的值,可以用perror()函数输出错误。

 

与此类似的UNIX接口有:open , read , write ,lseek,create ,opendir ,readdir,等等,慢慢学慢慢用,孰能生巧。

那么,为什么说这些知识点用到了加密解密上了,怎么用的?

比如,现在有一串密码.

       I123W598DWADA88DASDAJ

       这串密码需要进行加密,那么我们先用一个char型的数组将它保存起来。

       Charbuffer[] = {‘ I’,1,2,3,’W’,5,9,8,’D’,’W’,’A’,’D’,’A’,8,8,’D’,’A’,’S’,’D’,’A’,’J’} ;

       那如何加密?

我们可以用下面的方法来对这串数组进行简单的加密:

#include <stdio.h>
#define  NR(x)  (sizeof(x)/sizeof(x[0]))

unsigned char buffer[] = {'I',1,2,3,'W',5,9,8,'D','W','A','D','A',8,8,'D','A','S','D','A','J' } ;

//加密 
void  Crypt_Data(unsigned char buffer[]);
//解密 
void  Uncrypt_Data(unsigned char buffer[]);
int main(void)
{
	static int i = 0 ; 
	//将数组加密 
	Crypt_Data(buffer);
	//将数组解密 
	Uncrypt_Data(buffer);
	//数组输出 
	for(i = 0 ; i < NR(buffer) ; i++){
		if(buffer[i] < 60) 
			buffer[i] = buffer[i] + '0' ;
		else
			buffer[i] = buffer[i] ;	
	}	
	printf("%s\n",buffer); 	
	return 0 ;
}

//加密 
void  Crypt_Data(unsigned char buffer[])
{
	static int i = 0 ; 
	for(i = 0 ; i < NR(buffer) ; i++)
	{
		buffer[i] << 1 ;   //将数组中每个数据按位左移1位 
		buffer[i] += 2 ;   //左移完都加上2 
		buffer[i] += 3 ;   //都加上2后都加上3
		buffer[i] >> 4 ;   //整体数据按位左移4位 
	} 
}

//解密 
void  Uncrypt_Data(unsigned char buffer[])
{
	static int i = 0 ;	
	for(i = 0 ; i < NR(buffer) ; i++)
	{
		buffer[i] >> 1 ;   //按照加密的格式将数组解密出来 
		buffer[i] -= 2 ;
		buffer[i] -= 3 ;
		buffer[i] << 4 ;
	}
}
运行结果:
<img src="http://img.blog.csdn.net/20160107214053180?watermark/2/text/aHR0cDovL2Jsb2cuY3Nkbi5uZXQv/font/5a6L5L2T/fontsize/400/fill/I0JBQkFCMA==/dissolve/70/gravity/Center" alt="" />
 
 
 好像没和文件有什么关系对吧?哈哈,这就需要开动脑经啦。如果现在数据都在一个文件里,我
要将数据读出来,然后进行加密操作存在一个数组里去,接着将原来的文件的数据清空,然后再写到这个文件里去。思路就是这样子: 

首先你先创建一个文件写上我说的‘ I’,1,2,3,’W’,5,9,8,’D’,’W’,’A’,’D’,’A’,8,8,’D’,’A’,’S’,’D’,’A’,’J’这串数据

接着你就可以编程进行操作了: 

1 、 fopen :打开文件   

2、fread :从文件里读数据存到一个buffer数组里   

3、加密    

4、fclose :关闭文件描述符  

5、fopen以清空文件的模式接着打开这个文件。

6、lseek:偏移文件指针的位置     

7、fwrite 将加密完的数据写入这个文件

8、加密完成

9、fclose:关闭文件描述符

加密操作大概就是这个样子,解密也是一样的,不用多说了。

同时,以上的在linux下开发也可以用open , read , write , lseek ,close这些接口来代替。

但是UNIX接口对于块数据效率会比较高,对于小的数据效率就低了,所以,在文件不大的情况下(小于一块),建议还是使用标准C的接口。

今天就到这里,往后遇到什么问题,再做总结      






目录
相关文章
|
1月前
|
传感器 安全 物联网
量子加密技术的应用领域有哪些?
量子加密技术的应用领域有哪些?
191 55
|
17天前
|
存储 安全 网络安全
网络安全的盾与剑:漏洞防御与加密技术的实战应用
在数字化浪潮中,网络安全成为保护信息资产的重中之重。本文将深入探讨网络安全的两个关键领域——安全漏洞的防御策略和加密技术的应用,通过具体案例分析常见的安全威胁,并提供实用的防护措施。同时,我们将展示如何利用Python编程语言实现简单的加密算法,增强读者的安全意识和技术能力。文章旨在为非专业读者提供一扇了解网络安全复杂世界的窗口,以及为专业人士提供可立即投入使用的技术参考。
|
22天前
|
传感器 人工智能 物联网
C 语言在计算机科学中尤其在硬件交互方面占据重要地位。本文探讨了 C 语言与硬件交互的主要方法,包括直接访问硬件寄存器、中断处理、I/O 端口操作、内存映射 I/O 和设备驱动程序开发
C 语言在计算机科学中尤其在硬件交互方面占据重要地位。本文探讨了 C 语言与硬件交互的主要方法,包括直接访问硬件寄存器、中断处理、I/O 端口操作、内存映射 I/O 和设备驱动程序开发,以及面临的挑战和未来趋势,旨在帮助读者深入了解并掌握这些关键技术。
40 6
|
26天前
|
存储 安全 物联网
C语言物联网开发之设备安全与代码可靠性隐患
物联网设备的C语言代码安全与可靠性至关重要。一是防范代码安全漏洞,包括缓冲区溢出和代码注入风险,通过使用安全函数和严格输入验证来预防。二是提高代码跨平台兼容性,利用`stdint.h`定义统一的数据类型,并通过硬件接口抽象与适配减少平台间的差异,确保程序稳定运行。
|
21天前
|
机器学习/深度学习 算法 数据挖掘
C语言在机器学习中的应用及其重要性。C语言以其高效性、灵活性和可移植性,适合开发高性能的机器学习算法,尤其在底层算法实现、嵌入式系统和高性能计算中表现突出
本文探讨了C语言在机器学习中的应用及其重要性。C语言以其高效性、灵活性和可移植性,适合开发高性能的机器学习算法,尤其在底层算法实现、嵌入式系统和高性能计算中表现突出。文章还介绍了C语言在知名机器学习库中的作用,以及与Python等语言结合使用的案例,展望了其未来发展的挑战与机遇。
39 1
|
21天前
|
NoSQL 编译器 C语言
C语言调试是开发中的重要技能,涵盖基本技巧如打印输出、断点调试和单步执行,以及使用GCC、GDB、Visual Studio和Eclipse CDT等工具。
C语言调试是开发中的重要技能,涵盖基本技巧如打印输出、断点调试和单步执行,以及使用GCC、GDB、Visual Studio和Eclipse CDT等工具。高级技巧包括内存检查、性能分析和符号调试。通过实践案例学习如何有效定位和解决问题,同时注意保持耐心、合理利用工具、记录过程并避免过度调试,以提高编程能力和开发效率。
36 1
|
21天前
|
传感器 存储 物联网
在物联网(IoT)快速发展的今天,C语言作为物联网开发中的关键工具,以其高效、灵活、可移植的特点
在物联网(IoT)快速发展的今天,C语言作为物联网开发中的关键工具,以其高效、灵活、可移植的特点,广泛应用于嵌入式系统开发、通信协议实现及后端服务构建等领域,成为推动物联网技术进步的重要力量。
30 1
|
21天前
|
人工智能 安全 算法
基于C语言的嵌入式系统开发,涵盖嵌入式系统概述、C语言的优势、开发流程、关键技术、应用实例及面临的挑战与未来趋势。
本文深入探讨了基于C语言的嵌入式系统开发,涵盖嵌入式系统概述、C语言的优势、开发流程、关键技术、应用实例及面临的挑战与未来趋势。C语言因其高效、可移植、灵活及成熟度高等特点,在嵌入式系统开发中占据重要地位。文章还介绍了从系统需求分析到部署维护的完整开发流程,以及中断处理、内存管理等关键技术,并展望了嵌入式系统在物联网和人工智能领域的未来发展。
44 1
|
22天前
|
存储 算法 C语言
用C语言开发游戏的实践过程,包括选择游戏类型、设计游戏框架、实现图形界面、游戏逻辑、调整游戏难度、添加音效音乐、性能优化、测试调试等内容
本文探讨了用C语言开发游戏的实践过程,包括选择游戏类型、设计游戏框架、实现图形界面、游戏逻辑、调整游戏难度、添加音效音乐、性能优化、测试调试等内容,旨在为开发者提供全面的指导和灵感。
37 2
|
26天前
|
存储 网络协议 物联网
C 语言物联网开发之网络通信与数据传输难题
本文探讨了C语言在物联网开发中遇到的网络通信与数据传输挑战,分析了常见问题并提出了优化策略,旨在提高数据传输效率和系统稳定性。
下一篇
DataWorks