总结C语言在嵌入式开发中应用的知识点(文件数据的加密与解密)
<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+ 以可读写方式打开文件,该文件必须存在。
,即该文件内容会消失。若文件不存在则建立该文件。
等等….
废话不多说,上代码:
#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不相同,则可能文件结尾或发生错误。从ferror和feof获取错误信息或检测是否到达文件结尾。
写:size_t fwrite(const void* buffer, size_t size, size_tcount, FILE* stream);
注意:这个函数以二进制形式对文件进行操作,不局限于文本文件
返回值:返回实际写入的数据块数目
)buffer:是一个指针,对fwrite来说,是要获取数据的地址;
)size:要写入内容的单字节数;
)count:要进行写入size字节的数据项的个数;
)stream:目标文件指针;
)返回实际写入的数据项个数count。
偏移:
int fseek(FILE *stream, long offset, int fromwhere);
函数设置文件指针stream的位置。如果执行成功,stream将指向以fromwhere(偏移起始位置:文件头0(SEEK_SET),当前位置1(SEEK_CUR),文件尾2(SEEK_END))为基准,偏移offset(指针偏移量)个字节的位置。如果执行失败(比如offset超过文件自身大小),则不改变stream指向的位置。
返回值:
,失败返回-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的接口。
今天就到这里,往后遇到什么问题,再做总结
总结C语言在嵌入式开发中应用的知识点(文件数据的加密与解密)的更多相关文章
- 嵌入式开发中常见3个的C语言技巧
Hey,大家好!我是CrazyCatJack.今天我来说几个在嵌入式开发中常用的C语言技巧吧.也许你曾经用过,也许你只是见到过但是没有深入理解.那么今天好好补充下吧^_^ 1.指向函数的指针 指针不光 ...
- ARM嵌入式开发中的GCC内联汇编__asm__
在针对ARM体系结构的编程中,一般很难直接使用C语言产生操作协处理器的相关代码,因此使用汇编语言来实现就成为了唯一的选择.但如果完全通过汇编代码实现,又会过于复杂.难以调试.因此,C语言内嵌汇编的方式 ...
- PHP 使用 mcrypt 扩展中的 mcrypt_encrypt() 和 mcrypt_decrypt() 对数据进行加密和解密
<?php /* 使用 mcrypt 扩展中的 mcrypt_encrypt() 和 mcrypt_decrypt() 对数据进行加密和解密 */ // 加密 $algorithm = MCRY ...
- iOS开发备忘录:属性列表文件数据持久化
属性列表文件是一种XML文件,Foundation框架中的数组和字典等都可以于属性列表文件相互转换. NSArray类常用读写属性列表文件的方法: +arrayWithContentsOfFile:类 ...
- 在嵌入式开发中应该这样理解嵌入式C编程
一.新手常常问的一个问题:C语言和嵌入式C编程有什么区别?而嵌入式工程师一般都会告诉你,其区别在于嵌入式的C语言是跑在嵌入式的开发板上的,CPU和电脑不一样,所以编译器也是不一样的,生成的可执行程序也 ...
- android开发中的5种存储数据方式
数据存储在开发中是使用最频繁的,根据不同的情况选择不同的存储数据方式对于提高开发效率很有帮助.下面笔者在主要介绍Android平台中实现数据存储的5种方式. 1.使用SharedPreferences ...
- 读书笔记-详解C程序开发中 .c和.h文件的区别
一个简单的问题:.c和.h文件的区别 学了几个月的C语言,反而觉得越来越不懂了.同样是子程序,可以定义在.c文件中,也可以定义在.h文件中,那这两个文件到底在用法上有什么区别呢? 2楼: 子程序不要定 ...
- Web开发之编码与解码、签名、加密与解密
在Web开发中,编码与解码.签名.加密与解密是非常常见的问题.本文不会介绍具体实例,而是介绍这些的原理.用途与区别.一.编码与解码 在Web开发中,需要通过URL的query参数来传递数 ...
- 通过Jquery中Ajax获取json文件数据
1. JSON(JavaScript Object Notation): javaScript对象表示法: 是存储和交换文本信息的语法,比xml更小,更快,更易解析. 2. JSON基本书写格式 : ...
随机推荐
- (Java)微信之个人公众账号开发(一)——进入开发者模式
本篇文章将教大家如何建立微信个人公众账号,(注意:后台全部是用javaweb相关技术开发),大家知道,现在微信公众账号分服务号和订阅号,现在我要讲的主要是个人微信公众账号的建立以及后台的开发,个人公众 ...
- Android Multimedia框架总结(四)MediaPlayer中从Java层到C++层类关系及prepare及之后其他过程
转载请把头部出处链接和尾部二维码一起转载,本文出自:http://blog.csdn.net/hejjunlin/article/details/52420803 前言:在上篇中,分析了MediaPl ...
- 用Maven打包成EAR部署JBoss
基于原理的架构里面,考虑这次升级版本,可谓是一步一个脚印的向上走啊,可以说步步为坎,别人的知识,和自己的知识,相差很多啊,什么都懂点,但是具体没有使用,就理解不深刻了,心有余而力不足,所以一切我们自己 ...
- Struts 2之Servlet API
Struts 2对Servlet API进行了封装,是业务层更加独立,如果需要调用Request.Response等Servlet API有两种途径 利用ServletActinContext的静态方 ...
- Android必知必会-自定义Scrollbar样式
如果移动端访问不佳,请使用–>GitHub版 背景 设计师给的设计图完全依照 IOS 的标准来的,导致很多细节的控件都得自己重写,最近的设计图中有显示滚动条,Android 默认的滚动条样式(带 ...
- android开发之this.finish()的使用
在一个Activity用完之后应该将之finish掉,但是,之前在学校里自己摸索着开发时并没有太注意这个问题,因为activity无论是否finish掉对功能的影响貌似都不是那么明显(这是读书时候的观 ...
- 初探linux子系统集之timer子系统(一)
一般来说要让整个linux系统跑起来,那么一个必须的就是linux的时钟,也就是时间子系统了,这里正好工作需要,那么就研究下linux下的时间子系统了. linux内核必须完成两种主要的定时测量.一个 ...
- Java EE 之 过滤器入门学习与总结(2)
今天就对使用Filter技术能做什么来个小小的归纳.也为了方便今后的复习. 控制浏览器不进行对jsp页面的缓存 //在doFilter方法中添加这样的代码 HttpServletRequest req ...
- listview下拉刷新上拉加载扩展(二)-仿美团外卖
经过前几篇的listview下拉刷新上拉加载讲解,相信你对其实现机制有了一个深刻的认识了吧,那么这篇文章我们来实现一个高级的listview下拉刷新上拉加载-仿新版美团外卖的袋鼠动画: 项目结构: 是 ...
- ROS(indigo)国外开源示例包括多机器人控制等基于V-Rep和Gazebo的仿真
ROS(indigo)国外开源示例包括多机器人的V-Rep和Gazebo仿真等 1 micros_swarm_framework 使用超级经典的stage. http://wiki.ros.org/m ...