- °³¿ä
- ¼Ò½º
- Base64.h
- Base64.cpp
- ¸µÅ©
1 °³¿ä
MIME°ú °ü·ÃµÈ °÷¿¡¼ ÀÚÁÖ ¾²ÀÌ´Â base64 ÀÎÄÚµù/µðÄÚµù ¸ðµâÀÌ´Ù. ¹ÙÀ̳ʸ®¸¦ ¹®ÀÚ¿·Î, ¹®ÀÚ¿À» ¹ÙÀ̳ʸ®·Î º¯È¯½ÃÄÑÁÖ´Â ¾Ë°í¸®ÁòÀÌ´Ù. MIME°ú °ü·ÃµÈ °ÍÀº ¾Æ´ÏÁö¸¸, ¾ÏÈ£È¿Í °ü·ÃÇØ¼ ÇÊ¿äÇÒ ¶§°¡ Àִµ¥, Win32¿¡¼´Â XP¿¡¼¸¸ ¹®ÀÚ¿ ÀÎÄÚµù °ü·Ã API°¡ Àֱ⠶§¹®¿¡ ÀÌ·¸°Ô µû·Î ¸¸µé°Ô µÇ¾ú´Ù.
2 ¼Ò½º
#ifndef __BASE64_H__
#define __BASE64_H__
////////////////////////////////////////////////////////////////////////////////
/// \class Base64
/// \brief ¹ÙÀ̳ʸ® °ªÀ» base64·Î ÀÎÄÚµùÇϰųª, ¶Ç´Â ±× ¹Ý´ë·Î µðÄÚµùÇÏ´Â Àϰú
/// °ü·ÃµÈ ÇÔ¼öµéÀ» ¸ð¾Æ³õÀº Ŭ·¡½ºÀÌ´Ù.
///
/// ¿¹¸¦ µé¾î 'ABCD'¶ó´Â ½ºÆ®¸²Àº ÃÑ 32ºñÆ®´Ù. ÀÌ´Â ´ÙÀ½°ú °°ÀÌ ¸ÅÇεȴÙ.
///
/// <pre>
/// ABCD
///
/// A (65) B (66) C (67) D (68) (None) (None)
/// 01000001 01000010 01000011 01000100
///
/// 16 (Q) 20 (U) 9 (J) 3 (D) 17 (R) 0 (A) NA (=) NA (=)
/// 010000 010100 001001 000011 010001 000000 000000 000000
///
/// QUJDRA==
/// </pre>
///
/// À¯´Ö Å×½ºÆ®¸¦ À§ÇÑ ÄÉÀ̽º¸¦ µé¾îº¸ÀÚ¸é ´ÙÀ½°ú °°´Ù.
/// - ºó ¹®ÀÚ¿ : -> ->
/// - 1 ±ÛÀÚ : A -> QQ== -> A
/// - 2 ±ÛÀÚ : AB -> QUJD -> AB
/// - 3 ±ÛÀÚ : ABC -> QUJD -> ABC
/// - 4 ±ÛÀÚ : ABCD -> QUJDRA== -> ABCD
////////////////////////////////////////////////////////////////////////////////
class Base64
{
private:
unsigned char* m_Text; ///< NULL·Î ³¡³ª´Â ¹®ÀÚ¿ ¹öÆÛ
unsigned char* m_Binary; ///< ¹ÙÀ̳ʸ® ¹öÆÛ
size_t m_binarySize; ///< ¹ÙÀ̳ʸ® ¹öÆÛÀÇ ±æÀÌ
public:
/// \brief »ý¼ºÀÚ
Base64();
/// \brief ¼Ò¸êÀÚ
~Base64();
public:
/// \brief ¹ÙÀ̳ʸ®¸¦ base64 ¹®ÀÚ¿·Î ÀÎÄÚµùÇÑ´Ù.
const unsigned char* Encode(const unsigned char* binary, size_t binarySize);
/// \brief base64 ¹®ÀÚ¿À» ¹ÙÀ̳ʸ®·Î µðÄÚµùÇÑ´Ù.
const unsigned char* Decode(const unsigned char* text, size_t& binarySize);
private:
/// \brief 3°³ÀÇ 8ºñÆ® ¹ÙÀ̳ʸ®¸¦ 4°³ÀÇ 6ºñÆ® ¹®ÀÚ¿·Î ÀÎÄÚµùÇÑ´Ù.
void EncodeBlock(unsigned char in[3], unsigned char out[4], int len);
/// \brief 4°³ÀÇ 6ºñÆ® ¹®ÀÚ¿À» 3°³ÀÇ 8ºñÆ® ¹ÙÀ̳ʸ®·Î µðÄÚµùÇÑ´Ù.
void DecodeBlock(unsigned char in[4], unsigned char out[3]);
/// \brief º¹»ç »ý¼ºÀÚ´Â ±ÝÁö
Base64(const Base64&) {}
/// \brief ´ëÀÔ ¿¬»êÀÚ´Â ±ÝÁö
Base64& operator = (const Base64&) { return *this; }
};
#endif //__BASE64_H__
2.2 Base64.cpp
#include "Base64.h"
#include <stdio.h>
#include <stdlib.h>
#include <vector>
namespace
{
// ÀÎÄÚµùÀ» À§ÇÑ Å×À̺í (RFC1113)
const char EncodeTable[] =
"ABCDEFGHIJKLMNOPQRSTUVWXYZabcdefghijklmnopqrstuvwxyz0123456789+/";
// µðÄÚµùÀ» À§ÇÑ Å×À̺í
const char DecodeTable[] =
"|$$$}rstuvwxyz{$$$$$$$>?@ABCDEFGHIJKLMNOPQRSTUVW$$$$$$XYZ[\\]^_`abcdefghijklmnopq";
}
/// \brief »ý¼ºÀÚ
Base64::Base64()
: m_Binary(NULL), m_Text(NULL)
{
}
/// \brief ¼Ò¸êÀÚ
Base64::~Base64()
{
if (m_Binary != NULL) delete [] m_Binary;
if (m_Text != NULL) delete [] m_Text;
}
/// \brief ¹ÙÀ̳ʸ®¸¦ base64 ¹®ÀÚ¿·Î ÀÎÄÚµùÇÑ´Ù.
const unsigned char* Base64::Encode(const unsigned char* binary, size_t binarySize)
{
unsigned char in[3];
unsigned char out[4];
int len;
int blocksout = 0;
size_t current = 0;
std::vector<unsigned char> intermediate;
// ÀÎÄÚµùÇÑ´Ù.
while (current < binarySize)
{
len = 0;
for (int i = 0; i < 3; i++)
{
in[i] = binary[current];
if (current < binarySize)
{
current++;
len++;
}
else
{
in[i] = 0;
}
}
if (len)
{
EncodeBlock(in, out, len);
for (int i = 0; i < 4; i++)
intermediate.push_back(out[i]);
}
}
// º¤ÅÍ¿¡ ÀÖ´Â °ªÀ» ÅØ½ºÆ® ¹öÆÛ¿¡ º¹»çÇϱâ ÀÌÀü¿¡,
// ±âÁ¸ÀÇ ÅØ½ºÆ® ¹öÆÛ¸¦ »èÁ¦Çϰí, º¤ÅÍÀÇ Å©±â¸¸Å ¸Þ¸ð¸®¸¦ ÀçÇÒ´ç
if (m_Text != NULL) delete [] m_Text;
m_Text = new unsigned char[intermediate.size()+1];
memset(m_Text, 0, sizeof(unsigned char) * (intermediate.size()+1));
// º¤ÅÍ¿¡ ÀÖ´Â ³»¿ëÀ» ÅØ½ºÆ® ¹öÆÛ¿¡ º¹»ç
for (size_t r=0; r<intermediate.size(); r++)
m_Text[r] = intermediate[r];
return m_Text;
}
/// \brief base64 ¹®ÀÚ¿À» ¹ÙÀ̳ʸ®·Î µðÄÚµùÇÑ´Ù.
const unsigned char* Base64::Decode(const unsigned char* text, size_t& binarySize)
{
unsigned char in[4];
unsigned char out[3];
unsigned char v;
int i;
int len;
size_t current = 0;
std::vector<unsigned char> intermediate;
size_t TextSize = strlen((const char*)text);
while (current < TextSize)
{
for (i = 0, len = 0; i < 4 && current < TextSize; i++)
{
v = 0;
while (current < TextSize && v == 0)
{
v = text[current];
if (current < TextSize)
current++;
v = (unsigned char) ((v < 43 || v > 122) ? 0 : DecodeTable[v - 43]);
if (v) { v = (unsigned char) ((v == '$') ? 0 : v - 61); }
}
if (current < TextSize)
{
len++;
if (v) { in[i] = (unsigned char) (v - 1); }
}
else
{
in[i] = 0;
}
}
if (len)
{
DecodeBlock(in, out);
for (i = 0; i < len - 1; i++)
intermediate.push_back(out[i]);
}
}
// Áß°£ ¹öÆÛ¿¡ ÀÖ´Â °ªÀ» ¹ÙÀ̳ʸ® ¹öÆÛ·Î ¿Å°Ü¾ßÇÑ´Ù.
// ±âÁ¸ÀÇ ¹ÙÀ̳ʸ® ¹öÆÛ¸¦ »èÁ¦Çϰí, º¤ÅÍÀÇ Å©±â¸¸Å ¸Þ¸ð¸®¸¦ ÀçÇÒ´ç
// ¼ºñ½º·Î +1 Å©±â¸¸ÅÀÇ ¹öÆÛ¸¦ ¸¸µé¾î ³¡¿¡´Ù 0À» Áý¾î³Ö¾îÁØ´Ù.
if (m_Binary != NULL) delete [] m_Binary;
m_Binary = new unsigned char[intermediate.size()+1];
memset(m_Binary, 0, sizeof(unsigned char) * (intermediate.size()+1));
// º¤ÅÍ¿¡ ÀÖ´Â ³»¿ëÀ» ¹ÙÀ̳ʸ® ¹öÆÛ¿¡ º¹»ç
for (size_t r=0; r<intermediate.size(); r++)
m_Binary[r] = intermediate[r];
// »çÀÌÁî º¯¼ö¸¦ ¼¼ÆÃ
binarySize = intermediate.size();
return m_Binary;
}
/// \brief 3°³ÀÇ 8ºñÆ® ¹ÙÀ̳ʸ®¸¦ 4°³ÀÇ 6ºñÆ® ¹®ÀÚ¿·Î ÀÎÄÚµùÇÑ´Ù.
void Base64::EncodeBlock(unsigned char in[3], unsigned char out[4], int len)
{
out[0] = EncodeTable[in[0] >> 2];
out[1] = EncodeTable[((in[0] & 0x03) << 4) | ((in[1] & 0xf0) >> 4)];
out[2] = (unsigned char) (len > 1 ? EncodeTable[((in[1] & 0x0f) << 2) | ((in[2] & 0xc0) >> 6)] : '=');
out[3] = (unsigned char) (len > 2 ? EncodeTable[in[2] & 0x3f] : '=');
}
/// \brief 4°³ÀÇ 6ºñÆ® ¹®ÀÚ¿À» 3°³ÀÇ 8ºñÆ® ¹ÙÀ̳ʸ®·Î µðÄÚµùÇÑ´Ù.
void Base64::DecodeBlock(unsigned char in[4], unsigned char out[3])
{
out[0] = (unsigned char) (in[0] << 2 | in[1] >> 4);
out[1] = (unsigned char) (in[1] << 4 | in[2] >> 2);
out[2] = (unsigned char) (((in[2] << 6) & 0xc0) | in[3]);
}
3 ¸µÅ©
SeriousMoin v1 (koMoinMoin 1.0a4 Modified)