Quantcast
Channel: CSDN博客移动开发推荐文章
Viewing all articles
Browse latest Browse all 5930

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

$
0
0

联合体(共用体)

//联合体(共用体)

//不同类型的变量共同占用一段内存(相互覆盖),联合变量任何时刻只有一个成员存在,节省内存

//联合体变量的大小=最大的成员所占的字节数

//比喻:同穿一条裤子

#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


练习 文件的分割以及合并

作者:liudao7994 发表于2017/8/29 20:00:59 原文链接
阅读:18 评论:0 查看评论

Viewing all articles
Browse latest Browse all 5930

Trending Articles



<script src="https://jsc.adskeeper.com/r/s/rssing.com.1596347.js" async> </script>