windows API CryptBinaryToString

// windowsapi 直接调用的base64编码解码函数
// 
#include <windows.h>  
#include <Wincrypt.h>  
#pragma comment(lib,"crypt32")  


#include "base64.h"  
using namespace gloox;  


static unsigned long get_file_size(const char *path)  
{  
    unsigned long filesize = -1;  
    FILE *fp;  
    fp = fopen(path, "r");  
    if(fp == NULL)  
        return filesize;  
    fseek(fp, 0L, SEEK_END);  
    filesize = ftell(fp);  
    fclose(fp);  
    return filesize;  
}  


int _tmain(int argc, _TCHAR* argv[])  
{  
    const char path[] = "silence.png";  
    ULONG uSize = get_file_size(path);  


    FILE* fp = fopen(path, "rb");  
    char* inBuffer = new char[uSize];  
    ULONG uReaded = fread(inBuffer, 1, uSize, fp);  


    const BYTE* pbBinary = (const BYTE*)inBuffer;  
    DWORD dwLen;  
    CryptBinaryToStringA(pbBinary, uSize, CRYPT_STRING_BASE64, NULL, &dwLen);   //把二进制序列转换成字符串


    char* pCrypt1 = new char[dwLen];  
    CryptBinaryToStringA(pbBinary, uSize, CRYPT_STRING_BASE64, pCrypt1, &dwLen);//把二进制序列转换成字符串
    fclose(fp);  


    std::string strIn(pCrypt1);  
    int nIn = strIn.length();  


    std::string strOut = Base64::encode64(strIn);  
    int nOut = strOut.length();  


    //  
    std::string strFile = Base64::decode64(strOut);  
    int nFile = strFile.length();  
    int nFileSize = strFile.size();  


    DWORD cbBinary;  
    DWORD dwSkip;  
    DWORD dwFlags;  
    CryptStringToBinaryA(strFile.data(), nFile+1, CRYPT_STRING_BASE64, NULL, &cbBinary, &dwSkip, &dwFlags);  


    BYTE* outBuffer = new BYTE[cbBinary];  
    CryptStringToBinaryA(strFile.data(), nFile+1, CRYPT_STRING_BASE64, outBuffer, &cbBinary, &dwSkip, &dwFlags);  


    FILE* fp2 = fopen("silence2.png", "wb");  
    ULONG uWrite = fwrite(outBuffer, 1, uSize, fp2);  
    fclose(fp2);  


    return 0;  
}  
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值