京东6.18大促主会场领京享红包更优惠

 找回密码
 立即注册

QQ登录

只需一步,快速开始

linux c base64超长数据动态编码和解码

2018-4-27 20:57| 发布者: zhaojun917| 查看: 1190| 评论: 0|原作者: 梦想之都-俊月星空

摘要: 网上找的代码有一些BUG,经过我的调试运行现在没有问题了。#include string.h#include stdlib.h#include errno.h#include openssl/evp.h#pragma comment(lib, "libeay32.lib")///////////////////////////////////// ...
网上找的代码有一些BUG,经过我的调试运行现在没有问题了。
#include <string.h>
#include <stdlib.h>
#include <errno.h>
#include <openssl/evp.h>
#pragma comment(lib, "libeay32.lib")
//////////////////////////////////////////////////////////////////////////
// Base64编码
//////////////////////////////////////////////////////////////////////////
int EncodeBase64(const unsigned char *pFrom, unsigned char *pTo, int nFromLen)
{
 //int nEncodeLen = EVP_EncodeBlock(pTo, pFrom, nFromLen);
 //return nEncodeLen;
  EVP_ENCODE_CTX ctx;
  
 
  int nEncodeSize = 0;
  int nLen = 20; // 每次Encode的字节数
  int nEncodeLen = 0; // 每次Encode后返回的字节数
  int nOffset = 0;
  while (1)
  {
 
   EVP_EncodeInit(&ctx);
   if ((nOffset+nLen) > nFromLen)
   {
    nLen = nFromLen - nOffset;
   }
   
   printf("nEncodeLen[%d],nEncodeSize[%d]nOffset[%d]\n",nEncodeLen,nEncodeSize,nOffset);
   EVP_EncodeUpdate(&ctx, pTo+nEncodeSize, &nEncodeLen, pFrom+nOffset, nLen);
   nOffset += nLen;
   if (-1 == nEncodeLen || 0 == nEncodeLen)
   {
    break;
   }
   nEncodeSize += nEncodeLen;
  }
 
  EVP_EncodeFinal(&ctx, pTo+nEncodeSize, &nEncodeLen);
  nEncodeSize += nEncodeLen;
  printf("Encode str:%s, decode_str_len=%d/n", pTo, nEncodeSize);
 return nEncodeSize;
}

//////////////////////////////////////////////////////////////////////////
// Base64解码
//////////////////////////////////////////////////////////////////////////
int DecodeBase64(const unsigned char *pFrom, unsigned char *pTo, int nFromLen)
{
printf("DecodeBase64FromLen[%d] strlen(pFrom)[%d]\n" ,nFromLen,strlen(pFrom));
   /* int nDecodeLen = EVP_DecodeBlock(pTo, pFrom, nFromLen);
  printf(" nDecodeLen[%d]\n",nDecodeLen);
  return nDecodeLen;*/
  EVP_ENCODE_CTX ctx;
  
 
  int nDecodeSize = 0;  
  int nLen = 80;   // 每次decode 的字节数     
  int nDecodeLen = 0;  
  int nOffset = 0;  
  while(1)  
  { 
    EVP_DecodeInit(&ctx);    
   if ((nOffset + nLen) > nFromLen)  
   {     
    nLen = nFromLen - nOffset;  
   }     
   printf("nDecodeLen[%d],nDecodeSize[%d]nOffset[%d]nLen[%d]\n",nDecodeLen,nDecodeSize,nOffset,nLen);
   nDecodeLen=0;
   
   int ret = EVP_DecodeUpdate(&ctx, pTo+nDecodeSize, &nDecodeLen, pFrom+nOffset, nLen);  
  printf("EVP_DecodeUpdate_ret[%d]nDecodeLen[%d]\n",ret,nDecodeLen);
 
   nOffset += nLen;  
   nDecodeSize += nDecodeLen;  
   if (0 == ret)
   {
    break;
   }
   printf("EVP_DecodeUpdate_ret[%d]\n",ret);
   if (-1 == ret)
   {  
     printf("error...\n");
    break;  
   }  

  }
  printf("EVP_DecodeUpdate_nDecodeSize[%d]pFrom+nOffset[%s]\n",nDecodeSize,pFrom+nOffset);
  EVP_DecodeFinal(&ctx, pTo+nDecodeSize, &nDecodeLen);
  printf(" EVP_DecodeFinal[%d]\n",nDecodeLen);
  nDecodeSize += nDecodeLen;  
  printf("EVP_DecodeFinal_nOffset[%d]nDecodeSize[%d]\n",nOffset,nDecodeSize);
 
  return nDecodeSize; 
}

关闭

站长推荐上一条 /6 下一条

QQ|手机版|小黑屋|梦想之都-俊月星空 ( 粤ICP备18056059号 )|网站地图

GMT+8, 2025-7-2 00:05 , Processed in 0.032885 second(s), 19 queries .

Powered by Mxzdjyxk! X3.5

© 2001-2025 Discuz! Team.

返回顶部