快速业务通道

我使用过的一些校验函数

作者 佚名技术 来源 程序设计 浏览 发布时间 2012-06-29

sha1:

openssl提供了sha1的库,在安装openssl之后可以直接调用sha1。

MD5:

函数原型见附件,其中static void MDFile (filename)是对文件进行MD5校验的,static void MDString (inString)是对字符串进行MD5校验的。可以直接使用,也可以封装成库后在调用,值得注意的是,需要将源码中函数定义中的static去掉。

hash:

hash算法见附件。

TCP/IP/UDP/ICMP中的checksum:

/*计算校验和*/
USHORT checksum(USHORT *buffer,int size)
{
  unsigned long cksum=0;

  while(size>1)
  {
    cksum+=*buffer++;
    size -=sizeof(USHORT);
  }
  if(size)
  {
   cksum+=*(UCHAR*)buffer;
  }
  cksum =(cksum>>16)+(cksum & 0xffff);
  cksum+=(cksum>>16);
  return (USHORT)(~cksum);
}

CRC校验:

int file_crc32(const char *filename,unsigned int *crc)
{
 unsigned char buffer[MAX_BUFFER_SIZE];
 unsigned int vcrc = 0xffffffff;
 unsigned int read = 0;
 unsigned int filesize = 0;
 FILE *fp = NULL;
 struct stat fst;

 if(stat(filename,&fst))
 {
  printf("get file info failed\n");
  return -1;
 }
 /* unsigned long may denote the file size */
 if((filesize = fst.st_size) == 0)
  return -1;

 /* open file */
 if((fp = fopen(filename,"r")) == NULL)
 {
  printf("open the file failed\n");
 }

 while(filesize)
 {
  read = filesize > MAX_BUFFER_SIZE ? MAX_BUFFER_SIZE:filesize;
  if((read = fread(buffer,1,read,fp)) == 0) break;
  /* CRC */
  crc32(buffer,read,&vcrc);
  filesize -= read;
 }
 *crc = ~vcrc;
 fclose(fp);
 return 0;
}

void crc32(const unsigned char* byte,unsigned int length,unsigned int *vcrc)
{
 unsigned int i = 0;
 for(i = 0; i < length; i++)
 *vcrc = ((*vcrc) >> 8) ^ crc32table[byte[i] ^ ((*vcrc) & 0x000000FF)];
}

文章来源:http://qq164587043.blog.51cto.com/261469/159169

凌众科技专业提供服务器租用、服务器托管、企业邮局、虚拟主机等服务,公司网站:http://www.lingzhong.cn 为了给广大客户了解更多的技术信息,本技术文章收集来源于网络,凌众科技尊重文章作者的版权,如果有涉及你的版权有必要删除你的文章,请和我们联系。以上信息与文章正文是不可分割的一部分,如果您要转载本文章,请保留以上信息,谢谢!

分享到: 更多

Copyright ©1999-2011 厦门凌众科技有限公司 厦门优通互联科技开发有限公司 All rights reserved

地址(ADD):厦门软件园二期望海路63号701E(东南融通旁) 邮编(ZIP):361008

电话:0592-5908028 传真:0592-5908039 咨询信箱:web@lingzhong.cn 咨询OICQ:173723134

《中华人民共和国增值电信业务经营许可证》闽B2-20100024  ICP备案:闽ICP备05037997号