Windows API base64编码/解码

时间:2016-12-03 05:45:26

标签: c++ api encoding base64 decoding

我想base64一个大文件(500MB)

我使用this code但它不适合大文件

我测试了CryptStringToBinary,但它也不起作用

我应该怎么做????

1 个答案:

答案 0 :(得分:0)

问题显然是没有足够的内存来在32位应用程序中存储500兆字节的字符串。

this link提到了一个解决方案,它将数据写入字符串。假设代码正常工作,调整它以写入文件流并不困难。

#include <windows.h>
#include <fstream>

static const wchar_t *Base64Digits = L"ABCDEFGHIJKLMNOPQRSTUVWXYZabcdefghijklmnopqrstuvwxyz0123456789+/";

int Base64Encode(const BYTE* pSrc, int nLenSrc, std::wostream& pDstStrm, int nLenDst)
{
    wchar_t pDst[4];
    int nLenOut = 0;

    while (nLenSrc > 0) {
        if (nLenDst < 4) return(0); 
        int len = 0;
        BYTE s1 = pSrc[len++];
        BYTE s2 = (nLenSrc > 1) ? pSrc[len++] : 0;
        BYTE s3 = (nLenSrc > 2) ? pSrc[len++] : 0;
        pSrc += len;
        nLenSrc -= len;

        //------------------ lookup the right digits for output
        pDst[0] = Base64Digits[(s1 >> 2) & 0x3F];
        pDst[1] = Base64Digits[(((s1 & 0x3) << 4) | ((s2 >> 4) & 0xF)) & 0x3F];
        pDst[2] = Base64Digits[(((s2 & 0xF) << 2) | ((s3 >> 6) & 0x3)) & 0x3F];
        pDst[3] = Base64Digits[s3 & 0x3F];

        //--------- end of input handling
        if (len < 3) {  // less than 24 src bits encoded, pad with '='
            pDst[3] = L'=';
            if (len == 1)
                pDst[2] = L'=';
        }

        nLenOut += 4;

        // write the data to a file
        pDstStrm.write(pDst,4);

        nLenDst -= 4;
    }

    if (nLenDst > 0) *pDst = 0;

    return (nLenOut);
}

唯一的改变是将4个字节写入宽流而不是将数据附加到字符串

以下是一个示例电话:

int main()
{
    std::wofstream ofs(L"testfile.out");
    Base64Encode((BYTE*)"This is a test", strlen("This is a test"), ofs, 1000);
}

上面会生成一个带有base64字符串VGhpcyBpcyBhIHRlc3Q=的文件,在解码后生成This is a test

请注意,参数为std::wostream,这意味着任何宽输出流类(例如std::wostringstream)都可以使用。