C#などでは、簡単に変換できるクラスが用意されていますが、VC++のライブラリである”WinCrypt.h”を利用したBase64の文字列変換のやり方について紹介します。
WinCrypt
暗号化を取り扱うクラスとして、古くから提供されているクラスです。今でも現役としてVCでは活躍していてくれています。
#include <wincrypt.h>
#progma comment (lib, "crypt32.lib")
こんな感じで、ヘッダーとライブラリをソースに読み込ませます。
Base64変換(エンコードとデコード)
後は、CryptStringToBinaryとCryptBinaryToStringの関数を使って、文字列とバイト配列を使ってエンコードとデコードを行っていきます。
それぞれ関数化をしていますが、具体的にはこんな感じのコードです。
Base64エンコード(バイト配列から文字列)
bool CrypttoBase64Encode(BYTE* pbSource, DWORD dwSourceLength, CString sBase64)
{
bool bResult = false;
DWORD dwDestLength = 0;
LPTSTR psDest = NULL;
if (CryptBinaryToString(pbSource, dwSourceLength, CRYPT_STRING_BASE64, NULL, &dwDestLength) == TRUE)
{
psDest = new TCHAR[dwDestLength + 1];
if (CryptBinaryToString(pbSource, dwSourceLength, CRYPT_STRING_BASE64, psDest, &dwDestLength) == TRUE)
{
sBase64 = CString(psDest);
bResult = true;
}
delete psDest;
}
return bResult;
}
Base64デコード(文字列からバイト配列)
bool CrypttoBase64Decode(CString sBase64, BYTE* pbDest, DWORD& dwDestLength)
{
if (CryptStringToBinary(sBase64, sBase64.GetLength(), CRYPT_STRING_BASE64, NULL, &dwDestLength, NULL, NULL) == TRUE)
{
if (pbDest == NULL)
{
return true;
}
if (CryptStringToBinary(sBase64, sBase64.GetLength(), CRYPT_STRING_BASE64, pbDest, &dwDestLength, NULL, NULL) == TRUE)
{
return true;
}
}
return false;
}
まとめ
VC++でアプリやサービスを書くことは少なくなっていますが、Web関連のプロジェクトを進めていく中で、HTTPにデータを通す過程で暗号化などでBASE64技術は必要不可欠になってきています。
汎用クラスとして、作っておけば簡単にVC++でもBase64を簡単に実装することができます。
スポンサーリンク
最後までご覧いただき、ありがとうございます。