How to convert a binary string into base64 encoded data
Asked Answered
P

2

6

I am receiving binary data in a string. I want to encode that into Base64. Is there any class to do that operation (I want an API).

Prenomen answered 17/6, 2011 at 11:50 Comment(1)
What language(s) are you familiar with?Burbank
C
3

CryptBinaryToString ...if you target to Windows platform

Here is a little sample:

#include <Windows.h>

#pragma comment(lib, "crypt32.lib")

int main()
{
    LPCSTR pszSource = "Man is distinguished, not only by his reason, but ...";
    DWORD nDestinationSize;
    if (CryptBinaryToString(reinterpret_cast<const BYTE*> (pszSource), strlen(pszSource), CRYPT_STRING_BASE64, nullptr, &nDestinationSize))
    {
        LPTSTR pszDestination = static_cast<LPTSTR> (HeapAlloc(GetProcessHeap(), HEAP_NO_SERIALIZE, nDestinationSize * sizeof(TCHAR)));
        if (pszDestination)
        {
            if (CryptBinaryToString(reinterpret_cast<const BYTE*> (pszSource), strlen(pszSource), CRYPT_STRING_BASE64, pszDestination, &nDestinationSize))
            {
                // Succeeded: 'pszDestination' is 'pszSource' encoded to base64.
            }
            HeapFree(GetProcessHeap(), HEAP_NO_SERIALIZE, pszDestination);
        }
    }
    return 0;
}
Corral answered 6/10, 2015 at 11:29 Comment(1)
this is windows only answerBalliol
A
-1

Here is the code snippets based on @ruslan-garipov 's answer and msdn. Add To/From methods and some RAII.

std::string ToBase64(const BYTE* pBuf, DWORD cbSize)
{
    if (!pBuf || !cbSize) { return {}; }

    DWORD cchWith0{};
    if (!CryptBinaryToStringA(pBuf, cbSize, CRYPT_STRING_BASE64, nullptr, &cchWith0)) { return {}; }

    std::vector<char> base64Str(cchWith0, '\0');
    if (!CryptBinaryToStringA(pBuf, cbSize, CRYPT_STRING_BASE64, &base64Str[0], &cchWith0)) { return {}; }

    return base64Str.data();
}

std::vector<BYTE> FromBase64(const char* szBase64, DWORD cchWith0 = 0)
{
    if (!szBase64) { return {}; }

    cchWith0 = cchWith0 ? cchWith0 : DWORD(strlen(szBase64)) + 1;
    DWORD cbRequired{}, dwSkip{}, dwFlags{};
    if (!CryptStringToBinaryA(szBase64, cchWith0, CRYPT_STRING_BASE64, nullptr, &cbRequired, &dwSkip, &dwFlags)) { return {}; }

    std::vector<BYTE> binaryBuf(cbRequired);
    if (!CryptStringToBinaryA(szBase64, cchWith0, CRYPT_STRING_BASE64, &binaryBuf[0], &cbRequired, &dwSkip, &dwFlags)) { return {}; }

    return binaryBuf;
}
Agglutination answered 15/5 at 2:31 Comment(0)

© 2022 - 2024 — McMap. All rights reserved.