网上找的代码有一些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号 )|网站地图
GMT+8, 2025-7-2 00:05 , Processed in 0.032885 second(s), 19 queries .
Powered by Mxzdjyxk! X3.5
© 2001-2025 Discuz! Team.