C语言求文件MD5的函数用法
#ifndef MD5_H#define MD5_H typedef struct{ unsigned int count; unsigned int state; unsigned char buffer; }MD5_CTX;#define F(x,y,z) ((x & y) | (~x & z))#define G(x,y,z) ((x & z) | (y & ~z))#define H(x,y,z) (x^y^z)#define I(x,y,z) (y ^ (x | ~z))#define ROTATE_LEFT(x,n) ((x 《《 n) | (x 》》 (32-n)))#define FF(a,b,c,d,x,s,ac) \ { \ a += F(b,c,d) + x + ac; \ a = ROTATE_LEFT(a,s); \ a += b; \ }#define GG(a,b,c,d,x,s,ac) \ { \ a += G(b,c,d) + x + ac; \ a = ROTATE_LEFT(a,s); \ a += b; \ }#define HH(a,b,c,d,x,s,ac) \ { \ a += H(b,c,d) + x + ac; \ a = ROTATE_LEFT(a,s); \ a += b; \ }#define II(a,b,c,d,x,s,ac) \ { \ a += I(b,c,d) + x + ac; \ a = ROTATE_LEFT(a,s); \ a += b; \ } void MD5Init(MD5_CTX *context);void MD5Update(MD5_CTX *context,unsigned char *input,unsigned int inputlen);void MD5Final(MD5_CTX *context,unsigned char digest);void MD5Transform(unsigned int state,unsigned char block);void MD5Encode(unsigned char *output,unsigned int *input,unsigned int len);void MD5Decode(unsigned int *output,unsigned char *input,unsigned int len); #endif源文件md5.c#include 《memory.h》#include “md5.h“ unsigned char PADDING={0x80,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0, 0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0, 0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0, 0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0}; void MD5Init(MD5_CTX *context){ context-》count = 0; context-》count = 0; context-》state = 0x67452301; context-》state = 0xEFCDAB89; context-》state = 0x98BADCFE; context-》state = 0x10325476;}void MD5Update(MD5_CTX *context,unsigned char *input,unsigned int inputlen){ unsigned int i = 0,index = 0,partlen = 0; index = (context-》count 》》 3) & 0x3F; partlen = 64 - index; context-》count += inputlen 《《 3; if(context-》count 《 (inputlen 《《 3)) context-》count++; context-》count += inputlen 》》 29; if(inputlen 》= partlen) { memcpy(&context-》buffer[index],input,partlen); MD5Transform(context-》state,context-》buffer); for(i = partlen;i+64 《= inputlen;i+=64) MD5Transform(context-》state,&input[i]); index = 0; } else { i = 0; } memcpy(&context-》buffer[index],&input[i],inputlen-i);}void MD5Final(MD5_CTX *context,unsigned char digest){ unsigned int index = 0,padlen = 0; unsigned char bits; index = (context-》count 》》 3) & 0x3F; padlen = (index 《 56)?(56-index):(120-index); MD5Encode(bits,context-》count,8); MD5Update(context,PADDING,padlen); MD5Update(context,bits,8); MD5Encode(digest,context-》state,16);}void MD5Encode(unsigned char *output,unsigned int *input,unsigned int len){ unsigned int i = 0,j = 0; while(j 《 len) { output[j] = input[i] & 0xFF; output[j+1] = (input[i] 》》 8) & 0xFF; output[j+2] = (input[i] 》》 16) & 0xFF; output[j+3] = (input[i] 》》 24) & 0xFF; i++; j+=4; }}void MD5Decode(unsigned int *output,unsigned char *input,unsigned int len){ unsigned int i = 0,j = 0; while(j 《 len) { output[i] = (input[j]) | (input[j+1] 《《 8) | (input[j+2] 《《 16) | (input[j+3] 《《 24); i++; j+=4; }}void MD5Transform(unsigned int state,unsigned char block){ unsigned int a = state; unsigned int b = state; unsigned int c = state; unsigned int d = state; unsigned int x; MD5Decode(x,block,64); FF(a, b, c, d, x[ 0], 7, 0xd76aa478); /* 1 */ FF(d, a, b, c, x[ 1], 12, 0xe8c7b756); /* 2 */ FF(c, d, a, b, x[ 2], 17, 0x242070db); /* 3 */ FF(b, c, d, a, x[ 3], 22, 0xc1bdceee); /* 4 */ FF(a, b, c, d, x[ 4], 7, 0xf57c0faf); /* 5 */ FF(d, a, b, c, x[ 5], 12, 0x4787c62a); /* 6 */ FF(c, d, a, b, x[ 6], 17, 0xa8304613); /* 7 */ FF(b, c, d, a, x[ 7], 22, 0xfd469501); /* 8 */ FF(a, b, c, d, x[ 8], 7, 0x698098d8); /* 9 */ FF(d, a, b, c, x[ 9], 12, 0x8b44f7af); /* 10 */ FF(c, d, a, b, x, 17, 0xffff5bb1); /* 11 */ FF(b, c, d, a, x, 22, 0x895cd7be); /* 12 */ FF(a, b, c, d, x, 7, 0x6b901122); /* 13 */ FF(d, a, b, c, x, 12, 0xfd987193); /* 14 */ FF(c, d, a, b, x, 17, 0xa679438e); /* 15 */ FF(b, c, d, a, x, 22, 0x49b40821); /* 16 */
excel函数的使用方法汇总
一、SUMIFS函数实现多条件匹配SUMIFS函数本来是一个多条件求和的函数,格式为:SUMIFS(求和列,条件列1,条件1,条件列2,条件2……)但是当同时满足多个条件的结果只有一个时,多条件求和就等同于多条件匹配。公式为:=SUMIFS(D:D,A:A,F2,B:B,G2)要引用的列就是实际求和列,本例中是D列,而条件列分别就是A列和B列。优势:使用SUMIFS多条件匹配时,比较方便高效,公式简单易用,再增加条件也比较容易。不足:当要匹配的结果不是数字时,就不能使用这个方法了,同时当满足多个条件的数据不是唯一值时,结果可能错误。推荐指数:★★★★二、SUMPRODUCT函数实现多条件匹配SUMPRODUCT函数的功能是计算多个数组或区域的数据乘积之和,利用比较运算和逻辑值的特性,也可以实现多条件求和的功能,用来处理多条件匹配,其实和SUMIFS的原理差不多,公式为:=SUMPRODUCT(($A$2:$A$15=F2)*($B$2:$B$15=G2)*$D$2:$D$15)鉴于之前有多篇教程分析过SUMPRODUCT的用法和原理,这里就不对这个公式过多阐述了。不熟悉的同学可以查看往期教程《加了*的 SUMPRODUCT函数无所不能》优势:再增加条件时比较容易。不足:数组计算,数据量大时比较卡,对函数的用法不理解容易出错,并只对数字的匹配结果适用。
计算机语言都有哪些种
常见的高级语言有:汉字的输入技术的解决使电脑能为每一个中国人服务FORTRAN,适合进行科学计算,是编译型语言,组织程序比较灵活。BASIC,是由FORTRAN等高级语言的重要功能设计的人机对话式语言,简单易学,很受初学者欢迎。现在的BASIC语言发展很快,功能已大大增加,应用相当广泛。COBOL,是一种为处理商业资料而设计的语言。主要功能是描述数据结构和处理大批量数据。它使用英语词汇和句子较多。PASCAL,为一种结构程序语言,是在ALGOL语言的基础上发展起来的,作为一种描述算法的工具较为理想。C语言,是目前描述操作系统十分有效的高级设计语言,具有描述力强、灵活、方便等特点。由此看来,每种语言都有其优点和不同的应用方面,只要精通一种就可以做很多事,而浅尝辄止地学习多种语言却未必有多少用处。