aboutsummaryrefslogtreecommitdiff
path: root/CST 126/Homework2/Base64Converter.hpp
blob: 73980edbbd1004e76dd1323018a565d4747d8801 (plain) (blame)
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
#ifndef BASE64_CONVERTER
#define BASE64_CONVERTER

#include <iostream>
#include <string>
#include <vector>

using std::string;
using std::vector;

typedef unsigned char UC;
typedef unsigned int UI;
#define EXTRA '^'
#define MASK1 0xfc
#define MASK2 0x03
#define MASK3 0xf0
#define MASK4 0x0f
#define MASK5 0xc0
#define MASK6 0x3f
#define MASK7 0x30
#define MASK8 0x3c

const string characterMap = "ABCDEFGHIJKLMNOPQRSTUVWXYZabcdefghijklmnopqrstuvwxyz0123456789+/";

inline string Base64Encode(UC const* buffer, size_t& size)
{
    string encoded = "";

    UI i = 0,
	j = 0,
	k = 0;

    UC temp_a_3[3],
	temp_4[4];

    for (i = 0; i < size; i += 3) {

        for (j = i, k = 0; j < size && j < i + 3; j++) 
            temp_a_3[k++] = *(buffer++);

        for (; k < 3; k++) 
            temp_a_3[k] = '\0';

        temp_4[0] = (temp_a_3[0] & MASK1) >> 2;
        temp_4[1] = ((temp_a_3[0] & MASK2) << 4) + ((temp_a_3[1] & MASK3) >> 4);
        temp_4[2] = ((temp_a_3[1] & MASK4) << 2) + ((temp_a_3[2] & MASK5) >> 6);
        temp_4[3] = temp_a_3[2] & MASK6;

        for (j = i, k = 0; j < size + 1 && j < i + 4; j++, k++)
            encoded += characterMap[temp_4[k]];

        for (; k < 4; k++) 
            encoded += EXTRA;
    }

    return encoded;
}

inline vector<UC> Base64Decoder(string const& encoded)
{
    UI i = 0,
	j = 0,
	k = 0,
	in_len = encoded.size();

    UC temp_a_3[3],
	temp_4[4];

    vector<UC> decoded;

    for (i = 0; i < in_len; i += 4) {

        for (j = i, k = 0; j < i + 4 && encoded[j] != EXTRA; j++)
            temp_4[k++] = characterMap.find(encoded[j]);

        for (; k < 4; k++) 
            temp_4[k++] = '\0';

        temp_a_3[0] = (temp_4[0] << 2) + ((temp_4[1] & MASK7) >> 4);
        temp_a_3[1] = ((temp_4[1] & MASK4) << 4) + ((temp_4[2] & MASK8) >> 2);
        temp_a_3[2] = ((temp_4[2] & MASK2) << 6) + temp_4[3];

        for (j = i, k = 0; k < 3 && encoded[j + 1] != EXTRA; j++, k++)
            decoded.push_back(temp_a_3[k]);
    }

    return decoded;
}




























#endif