一段把文件转为Base64编码和还原的代码

来源:互联网 发布:dns使用的端口号 编辑:程序博客网 时间:2024/05/16 06:16

把下面的代码编译成一个可执行的控制台程序,加入名称为genf.exe

执行genf e xxxx.dat,加密文件

执行genf d xxxx.txt, 还原文件

做这个东西的主要目的是在这个Blog没有找到哪里可以上传文件

 

#include <stdio.h>
#include <stdlib.h>
#include <string.h>

#define BASE64CHAR( ch ) ( (((ch)>='a')&&((ch)<='z')) || /
  (((ch)>='A')&&((ch)<='Z')) ||      /
  (((ch)>='0')&&((ch)<='9')) ||      /
  ((ch)=='+') || ((ch)=='/') || ((ch)=='='))
void Base64Encode( void* pSrc, int nLen, char* pObj )
{//pObj的长度需要(nLen+2)/3 * 4 +1 ,最后会填0
 static char Base64EnTAB[] = "ABCDEFGHIJKLMNOPQRSTUVWXYZabcdefghijklmnopqrstuvwxyz0123456789+/=";

 int i;
 int count = nLen / 3;
 unsigned char *psSrc = (unsigned char*) pSrc;
 unsigned char *pszObj = (unsigned char *)pObj;

 unsigned char ch1,ch2,ch3;
 for( i = 0 ; i < count ; i ++ )
 {
  ch1 = *psSrc ++;
  ch2 = *psSrc ++;
  ch3 = *psSrc ++;
  *pszObj ++ = ch1 >> 2;
  *pszObj ++ = ((ch1<<4)|(ch2>>4)) & 0x3f;
  *pszObj ++ = ((ch2<<2)|(ch3>>6)) & 0x3f;
  *pszObj ++ = ch3 & 0x3f;
 }
 count = nLen - (psSrc - (unsigned char *)pSrc);
 if( count == 1 || count == 2)
 {
  ch1 = *psSrc ++;
  if( count == 2 )
  {
   ch2 = *psSrc ++;
   ch3 = 0;
   *pszObj ++ = ch1 >> 2;
   *pszObj ++ = ((ch1<<4)|(ch2>>4)) & 0x3f;
   *pszObj ++ = ((ch2<<2)|(ch3&0x03)) & 0x3f;
  }
  else
  {
   *pszObj ++ = ch1 >> 2;
   ch2 = 0;
   *pszObj ++ = ((ch1<<4)|(ch2>>4)) & 0x3f;
   *pszObj ++ = 64;
  }
  *pszObj ++ = 64;
 }
 count = pszObj - (unsigned char *)pObj;
 pszObj = (unsigned char *)pObj;
 for( i = 0 ; i < count ; i ++ )
 {
  *pszObj = Base64EnTAB[ *pszObj ];
  pszObj ++;
  //如果用下面的写法,在不同的编译器下,会有不同的结果
  //*pszObj ++ = Base64EnTAB[ *pszObj ];
 }
 *pszObj = '/0';
}

int Base64Decode( char* pszSrc, void* pObj )
{//pObj需要的长度是strlen(pszSrc)/4*3
 static char Base64DeTAB[] =
 {//0x2b begin
           62,0, 0, 0, 63,//0x2?
  52,53,54,55,56,57,58,59,60,61,0, 0, 0, 64,0, 0, //0x3?
  0, 0, 1, 2, 3, 4, 5, 6, 7, 8, 9, 10,11,12,13,14,//0x4?
  15,16,17,18,19,20,21,22,23,24,25,0, 0, 0, 0, 0, //0x5?
  0, 26,27,28,29,30,31,32,33,34,35,36,37,38,39,40,//0x6?
  41,42,43,44,45,46,47,48,49,50,51    //0x7?
 };

 int i;
 int count = strlen( pszSrc ) / 4;
 char* psObj = (char*)pObj;
 for( i = 0 ; i < count ; i ++ )
 {
  char ch1,ch2,ch3,ch4;
  ch1 = *pszSrc ++;
  ch2 = *pszSrc ++;
  ch3 = *pszSrc ++;
  ch4 = *pszSrc ++;

  if( BASE64CHAR(ch1) && BASE64CHAR(ch2) && BASE64CHAR(ch3) && BASE64CHAR(ch4))
  {
   ch1 = Base64DeTAB[ch1 - 0x2b];
   ch2 = Base64DeTAB[ch2 - 0x2b];
   ch3 = Base64DeTAB[ch3 - 0x2b];
   ch4 = Base64DeTAB[ch4 - 0x2b];
   *psObj ++ = (ch1<<2)|(ch2>>4);
   *psObj ++ = (ch2<<4)|(ch3>>2);
   *psObj ++ = (ch3<<6)|ch4;
  }
  else
   return -1;
 }
 return 0;
}

int WriteFileContent( const char* pszFileName, char* buf, int len )
{
 FILE* fp = fopen( pszFileName, "wb" );
 if( fp == NULL )
 {
  fprintf( stderr, "open file %s for write fail/n", pszFileName );
  return -1;
 }
 fwrite( buf, 1, len ,fp );
 fclose( fp );
 return 0;
}

char* ReadFileContent( const char* pszFileName, int* pFileLen )
{
 int filelen;
 char* buf = NULL;
 FILE* fp = fopen( pszFileName, "rb" );
 if( fp == NULL )
 {
  fprintf( stderr, "open file %s fail/n", pszFileName );
  return NULL;
 }
 fseek( fp, 0, SEEK_END );
 filelen = ftell( fp );
 fseek( fp, 0, SEEK_SET );
 if( filelen > 1024 * 1024 * 10 || filelen < 0 )//can not bigger than 10M
 {
  fprintf( stderr, "file %s is too large/n", pszFileName );
  goto l_end;
 }
 buf = (char*)malloc( filelen + 1 );
 if( buf == NULL )
 {
  fprintf( stderr, "malloc fail/n");
  goto l_end;
 }
 memset( buf, 0, filelen + 1 );
 fread( buf, 1, filelen ,fp );
 *pFileLen = filelen;
 return buf;
l_end:
 if( buf != NULL ) free( buf );
 fclose( fp );
 return NULL;
}

char* FilterBase64Char( char* buf, int len, int* pLen )
{
 int i;
 int indexNew = 0;
 char* pBufNew = malloc( len+1 );
 memset( pBufNew, 0, len + 1 );
 for( i=0;i<len;i++ )
 {
  if( BASE64CHAR(buf[i]) )
  {
   pBufNew[indexNew++] = buf[i];
  }
 }
 pBufNew[indexNew] = '/0';
 *pLen = indexNew;
 return pBufNew;
}

int decodeFile( const char* pszFileName )
{
 char* buf,*bufB64,*bufPlain;
 char szFileNew[512];
 int len;

 buf = ReadFileContent( pszFileName, &len );
 if( buf == NULL )
  return -1;
 
 bufB64 = FilterBase64Char( buf, len ,&len );
 
 bufPlain = malloc( len + 1);
 memset( bufPlain, 0, len+1);
 if( Base64Decode( bufB64, bufPlain ) != 0 )
 {
  fprintf( stderr, "Base64Decode fail/n");
  return -1;
 }
 sprintf( szFileNew, "%s.rar", pszFileName );
 if( WriteFileContent( szFileNew, bufPlain,strlen(bufB64)/4*3  ) != 0 )
  return -1;
 printf("Write to file [%s](%d) OK/n", szFileNew,strlen(bufB64)/4*3 );
 return 0;
}
int encodeFile( const char* pszFileName )
{
 char* buf,*bufB64;
 char szFileNew[512];
 int i,len;
 int index = 0;

 buf = ReadFileContent( pszFileName, &len );
 if( buf == NULL )
  return -1;

 bufB64 = malloc( len*2+80 );
 memset( bufB64, 0, len*2+80 );
 
 for( i = 0 ; i < len ; i += 57 )
 {
  char tmp[58];
  memset( tmp, 0, sizeof(tmp));
  memcpy( tmp, &buf[i], len-i>57?57:len-i);
  Base64Encode( tmp, 57, &bufB64[index] );
  index += 76;
  bufB64[index++] = '/r';
  bufB64[index++] = '/n';
 }
 sprintf( szFileNew, "%s.txt", pszFileName );
 if( WriteFileContent( szFileNew, bufB64,strlen(bufB64) ) != 0 )
  return -1;
 printf("Write to file [%s](%d) OK/n", szFileNew,strlen(bufB64) );
 return 0;
}

int main( int argc, char* argv[] )
{
 if( argc < 3 )
 {
  printf("Please input filename/n" );
  return 0;
 }
 if( argv[1][0] == 'd' || argv[1][0] == 'D' )
 {
  return decodeFile( argv[2] );
 }
 else if ( argv[1][0] == 'e' || argv[1][0] == 'E' )
 {
  return encodeFile( argv[2] );
 }
 else
 {
  fprintf( stderr, "Command must be 'd' or 'e'/n" );
  return -1;
 }
}

 

原创粉丝点击
热门问题 老师的惩罚 人脸识别 我在镇武司摸鱼那些年 重生之率土为王 我在大康的咸鱼生活 盘龙之生命进化 天生仙种 凡人之先天五行 春回大明朝 姑娘不必设防,我是瞎子 阴阳师地域鬼王定位在非洲怎么办 网吧忘记下机有小孩玩我号怎么办 等了三年老公还是不跟小三断怎么办 小三生孩子老公为责任断不了怎么办 没离婚去医院生孩子刷身份证怎么办 小孩早晨起床鼻子痒有鼻涕怎么办 孩子鼻梁上方和眼眶磕肿了怎么办 宝宝开空调冻的流鼻涕打喷嚏怎么办 狼人杀带耳机麦没声音怎么办 王者荣耀边境突围使刘邦大招怎么办 如果有个恶毒又有心机的后妈怎么办 qq炫舞的好忘了怎么办 百度网盘别人发我一个链接我怎么办 感觉地下和墙壁里有蚂蚁怎么办? 射像头监控摄像头家用卡满了怎么办 微乐贵阳捉鸡麻将不显示头像怎么办 苹果6p用久了卡怎么办 小猪民宿平台限制三天上线怎么办 交易猫买家申请了仲裁我的钱怎么办 雷达石英手表表里面有小灰尘怎么办 电脑宽带用户名和密码忘记了怎么办 腾讯会员不让别人在异地登录怎么办 中毒后电脑文件后缀是lnk怎么办 wps逗号隔的空不一样大怎么办 电脑盘里的文件删不了怎么办 在淘宝买的qq账号被找回了怎么办 微信公众号的密码忘了怎么办 公众号安全助手密码忘了怎么办 微博账号存在发布违规信息怎么办 余额宝转出到银行卡被冻结怎么办 银行账户被冻结被转出钱怎么办 从余额宝转出的资金被冻结怎么办 微信账号卖了但是实名认证了怎么办 uc下载文档里的文档全没了怎么办 二手乐视没有账号和密码怎么办 华为账号密码忘了手机卡丢了怎么办 联想平板微信更新后不可兼容怎么办 小米手机刷完机账号密码忘了怎么办 红米手机的小米账号密码忘了怎么办 小米手机账号密码手机号忘了怎么办 小米手机忘了账号和密码怎么办