| 网上找的代码有一些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;  } | 
 |手机版|小黑屋|梦想之都-俊月星空
( 粤ICP备18056059号 )|网站地图
|手机版|小黑屋|梦想之都-俊月星空
( 粤ICP备18056059号 )|网站地图
GMT+8, 2025-10-31 08:46 , Processed in 0.051157 second(s), 17 queries .
Powered by Mxzdjyxk! X3.5
© 2001-2025 Discuz! Team.