您的位置:首页 > 其它

01文件循环位移加密 C预处理宏2015/08/24

2015-08-26 21:20 288 查看

文件循环位移加密

核心代码

加密函数

void encrypt(char *str, int len)
{
int i = 0;
for (i = 0; i < len; i++)
{
unsigned char data = *str;  //一定转成unsigned不然负数进行右移的时候会不可预知
if (*str == 0) {
str++;
} else {
*str = data<<1 | ((data&(1<<7))>>7);
str++;
}
}
}


解密函数

void de_encrypt(char *str, int len)
{
int i = 0;
for (i = 0; i < len; i++)
{
unsigned char data = *str;
if (*str == 0) {
str++;
} else {
*str = data>>1 | ((data&1)<<7);
str++;
}
}
}


文件处理函数

FILE *fp1 = fopen("e:\\tmp\\1.jpg", "rb");
FILE *fp2 = fopen("e:\\tmp\\2.jpg", "wb");
int n;
char buf[1024];
char * key = "nimeiya";
while((n = fread(buf,1,1024,fs))>0)
{
encrypt(buf,n,key);
fwrite(buf,1,n,fd);
}


C预处理

不带参数的宏

#define MAX 10


如果使用宏来定义数据类型

#define CHAR char*

CHAR p1,p2

sizeof("%d, %d\n", sizeof(p1), sizeof(p2));  //结果4,1


因为p1是类型char*,p1是char类型,所以定义变量使用typedef最好

带参数的宏

#define SUM(a,b) (a)*(b)


1、SUM(a,b)里面,SUM和括号之间不能有空格, `#define SUM (a,b) (a)*(b)`,这样就是把'SUM'替换成`(a,b) (a)*(b)`;
2、一定不能吝啬括号,像'(a)*(b)'一定要单独用括号包含起来,不然如果'SUM(2+3)'就会变成'(2+3*2+3)',结果就不是你想得到的结果,
3、'#undef  SUM(a,b)'取消宏定义


利用宏创建字符串

#define str(x) "aaaaaaaa"#x"bbbbbbbb"
int main()
{
printf("%s\n", str(100))
}


结果
aaaaaaaa100bbbbbbbb


粘合剂 #运算符

#define SUM(a,b) (a##a+b##b)
void main()
{
printf("%d\n", SUM(2,3)) //SUM(2,3)====22+33
}


宏选择 #if #elif #endif(多选一)

跨平台模型

#include <stdio.h>

#define IOS         1
#define ANDROID     2
#define WPHONE      3

#define MACHINE     IOS//IOS ANDROID WPHONE

int main(void)
{
#if     MACHINE == IOS
printf("this is IOS code\n");
#elif   MACHINE == ANDROID
printf("this is ANDROID code\n");
#elif   MACHINE == WPHONE
printf("this is WPHONE code\n");
#endif
}


pragma宏命令

#pragma pack(1)     //按1字节对齐
struct mystruct
{
char    a;
short   b;
int     c;
char    d;
};
sizeof(struct mystruct) == 8;


补码

负数转补码
确定是负数---->这个数取绝对值------->然后把这个数按位取反+1
正数不变
按照这个原则,不需要理会符号位,按照补码规则会把符号位置一的

内存里面存的全是补码,还有内存里面只是0、1,不会有正负数,正负数都是按照特定规则解释的正数还是附属的


数据类型隐式转换

unsigned int a = 6;
int b = -20;

(a+b)>6?puts(">6"):puts("<=6");


结果是大于
>6


原因是以为无符号类型int和有符号int进行运算,结果会自动转化成无符号int,所以’-16’如果化成无符号数是一个特别大的数,所以>6;
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签: