android ndk 05 C语言 _union_enum 联合体 枚举 IO文件操作(文件加密解密)

来源:互联网 发布:angelababy百花奖知乎 编辑:程序博客网 时间:2024/05/17 23:11

联合体(共用体)

//联合体(共用体)//不同类型的变量共同占用一段内存(相互覆盖),联合变量任何时刻只有一个成员存在,节省内存//联合体变量的大小=最大的成员所占的字节数//比喻:同穿一条裤子#include <stdio.h>#include <stdlib.h>union MyValue{    int x;    int y;    double z;};void main(){    union MyValue d1;    d1.x = 10;    d1.y = 90;    /*最后一次赋值有效 ??? 为什么我这里必须药用这种注释才可以  双斜杠 会提示未闭合*/    /*d1.z = 23.8;*/    printf("d1.x = %d\n,d1.y = %d\n,d1.z = %lf\n", d1.x, d1.y, d1.z);    system("pause");}

联合体有什么好处? 因为联合体包含很多种类型 当传递参数的时候不确定的情况下可以使用联合体,只要是在联合体内的都行. PS 有点像java的泛型


image

举例: jni的源码里面也有这个联合体 可以参考下

typedef union jvalue {    jboolean    z;    jbyte       b;    jchar       c;    jshort      s;    jint        i;    jlong       j;    jfloat      f;    jdouble     d;    jobject     l;} jvalue;

//枚举(列举所有的情况)
//限定值,保证取值的安全性

enum Day{    Monday,    Tuesday,    Wednesday,    Thursday,    Friday,    Saturday,    Sunday};void main(){    //枚举的值,必须是括号中的值//    enum Day d = Monday;    printf("%#x,%d\n", &d, d);    getchar();}

image

文件 IO流操作

文件的读取 (文本)

#define _CRT_SECURE_NO_WARNINGS#include "stdlib.h"#include "stdio.h"#include "string.h"//注意这里的宏定义 没有会报错////读取文本文件void main(){    char *path = "E:\\code\\testIO.txt";    //打开    FILE *fp = fopen(path, "r");    if (fp == NULL){        printf("文件打开失败..");        return;    }    //读取    char buffer[50];//缓冲    while ((fgets(buffer, 50, fp))){        printf("%s", buffer);    }    //关闭    fclose(fp);    system("pause");}

结果图

image

文件的写入

//写入文本文件void main(){    char *path = "E:\\code\\testIO_new.txt";    //打开    FILE *fp = fopen(path, "w");    char *text = "sadfasdf这是新写入的数据 测试下开口";    fputs(text, fp);    //关闭流    fclose(fp);    system("pause");}

下面是效果图

image

文件的复制

//文件的复制(使用二进制的方式)void main(){    char *read_path = "E:\\code\\cat.jpg";    char *write_path = "E:\\code\\cat_new.jpg";    //读的文件 b字符表示操作二进制文件binary    FILE *read_fp = fopen(read_path, "rb");    FILE *write_fp = fopen(write_path, "wb");    //复制    int buff[50];    int len = 0;    while ((len = fread(buff, sizeof(int), 50, read_fp)) != 0){        //将督导的内容写到新的文件        fwrite(buff, sizeof(int), len, write_fp);    }    //关闭流    fclose(read_fp);    fclose(write_fp);    system("pause");}

结果图

image

获取文件的大小

void main(){    char *read_path = "E:\\code\\cat.jpg";    FILE *fp = fopen(read_path, "r");    //重新定位文件指针    //SEEK_END文件末尾,0偏移量    fseek(fp, 0, SEEK_END);    //返回当前的文件指针,相对于文件开头的位移量    long filesize = ftell(fp);    printf("%d\n", filesize);    getchar();}

结果图

image


/*“rt”      只读打开一个文本文件,只允许读数据“wt”      只写打开或建立一个文本文件,只允许写数据“at”      追加打开一个文本文件,并在文件末尾写数据“rb”      只读打开一个二进制文件,只允许读数据“wb”       只写打开或建立一个二进制文件,只允许写数据“ab”       追加打开一个二进制文件,并在文件末尾写数据“rt+”      读写打开一个文本文件,允许读和写“wt+”      读写打开或建立一个文本文件,允许读写“at+”     读写打开一个文本文件,允许读,或在文件末追加数据“rb+”      读写打开一个二进制文件,允许读和写“wb+”      读写打开或建立一个二进制文件,允许读和写“ab+”      读写打开一个二进制文件,允许读,或在文件末追加数据*/

练习: 文本文件加解密

//异或
//规则:1^1=0, 0^0=0, 1^0=1, 0^1=1 同为0,不同为1
//加密

//异或//规则:1^1=0, 0^0=0, 1^0=1, 0^1=1 同为0,不同为1//加密void crpypt(char normal_path[],char crypt_path[]){    //打开文件    FILE *normal_fp = fopen(normal_path, "r");    FILE *crypt_fp = fopen(crypt_path, "w");    //一次读取一个字符    int ch;    while ((ch = fgetc(normal_fp)) != EOF){ //End of File        //写入(异或运算)        fputc(ch ^ 9,crypt_fp);    }    //关闭    fclose(crypt_fp);    fclose(normal_fp);}
//解密void decrpypt(char crypt_path[], char decrypt_path[]){    //打开文件    FILE *normal_fp = fopen(crypt_path, "r");    FILE *crypt_fp = fopen(decrypt_path, "w");    //一次读取一个字符    int ch;    while ((ch = fgetc(normal_fp)) != EOF){ //End of File        //写入(异或运算)        fputc(ch ^ 9, crypt_fp);    }    //关闭    fclose(crypt_fp);    fclose(normal_fp);}

== 主函数调用—-

void main(){    char *normal_path = "E:\\dongnao\\vip\\ndk\\08_08_C_05\\files\\friends.txt";    char *crypt_path = "E:\\dongnao\\vip\\ndk\\08_08_C_05\\files\\friends_crypt.txt";    char *decrypt_path = "E:\\dongnao\\vip\\ndk\\08_08_C_05\\files\\friends_decrypt.txt";    //crpypt(normal_path, crypt_path);    //解密    decrpypt(crypt_path, decrypt_path);    getchar();}

调用加密结果
image

调用解密结果

image


下面是 二进制文件的加密解密(文件 图片 exe程序 都行)

void crypt(char normal_path[], char crypt_path[], char password[]){    //打开文件    FILE *normal_fp = fopen(normal_path, "rb");    FILE *crypt_fp = fopen(crypt_path, "wb");    //一次读取一个字符    int ch;    int i = 0; //循环使用密码中的字母进行异或运算    int pwd_len = strlen(password); //密码的长度    while ((ch = fgetc(normal_fp)) != EOF)    {        fputc(ch ^ password[i % pwd_len], crypt_fp);        i++;    }    fclose(normal_fp);    fclose(crypt_fp);}void main(){    char *normal_fp = "E:\\code\\cat_norm.jpg";    char *encryption_fp = "E:\\code\\cat_crypt.jpg";    char *decrpty_fp = "E:\\code\\cat_decrypt.jpg";    //加密    crypt(normal_fp, encryption_fp,"mypassworld");    system("pause");}

加密结果

image

解密代码

void crypt(char normal_path[], char crypt_path[], char password[]){    //打开文件    FILE *normal_fp = fopen(normal_path, "rb");    FILE *crypt_fp = fopen(crypt_path, "wb");    //一次读取一个字符    int ch;    int i = 0; //循环使用密码中的字母进行异或运算    int pwd_len = strlen(password); //密码的长度    while ((ch = fgetc(normal_fp)) != EOF)    {        fputc(ch ^ password[i % pwd_len], crypt_fp);        i++;    }    fclose(normal_fp);    fclose(crypt_fp);}void decrypt(char crypt_path[], char decrypt_path[], char password[]){    //打开文件    FILE *crypt_fp = fopen(crypt_path, "rb");    FILE *decrypt_fp = fopen(decrypt_path, "wb");    //一次读取一个字符    int ch;    int i = 0; //循环使用密码中的字母进行异或运算    int pwd_len = strlen(password); //密码的长度    while ((ch = fgetc(crypt_fp)) != EOF)    {        fputc(ch ^ password[i % pwd_len], decrypt_fp);        i++;    }    fclose(crypt_fp);    fclose(decrypt_fp);}void main(){    char *normal_fp = "E:\\code\\cat_norm.jpg";    char *encryption_fp = "E:\\code\\cat_crypt.jpg";    char *decrpty_fp = "E:\\code\\cat_decrypt.jpg";    //加密    //crypt(normal_fp, encryption_fp, "mypassworld");    //解密    decrypt(encryption_fp, decrpty_fp, "mypassworld");    system("pause");}

解密结果:

iamge


练习 文件的分割以及合并

原创粉丝点击