Base 64 Coding |
Email is based on text. Specifically, a simple email may content only ASCII characters. This implies that in a simple email is NOT possible to send other non ASCII characters, in the same way, it is not possible to send attachments. Base 64 coding was created to allow sending any kind of data by coding any type of data to 64 symbols as shown in the table below. El correo electrónico está basado en texto. Específicamente, un correo electrónico simple puede contener solamente caracteres ASCII. Esto implica que en un correo electrónico simple NO es posible enviar otros caracteres que no son ASCII, en la misma forma, no es posible enviar archivos adjuntos. La codificación Base 64 fue creada para permitir enviar cualquier tipo de datos por medio de 64 símbolos como se muestra en la tabla de abajo. |
Value | Char |
0 | A |
1 | B |
2 | C |
3 | D |
4 | E |
5 | F |
6 | G |
7 | H |
8 | I |
9 | J |
10 | K |
11 | L |
12 | M |
13 | N |
14 | O |
15 | P |
16 | Q |
17 | R |
18 | S |
19 | T |
20 | U |
21 | V |
22 | W |
23 | X |
24 | Y |
25 | Z |
26 | a |
27 | b |
28 | c |
29 | d |
30 | e |
31 | f |
32 | g |
33 | h |
34 | i |
35 | j |
36 | k |
37 | l |
38 | m |
39 | n |
40 | o |
41 | p |
42 | q |
43 | r |
44 | s |
45 | t |
46 | u |
47 | v |
48 | w |
49 | x |
50 | y |
51 | z |
52 | 0 |
53 | 1 |
54 | 2 |
55 | 3 |
56 | 4 |
57 | 5 |
58 | 6 |
59 | 7 |
60 | 8 |
61 | 9 |
62 | + |
63 | / |
Tip |
The figure below shows how Base coding works. First, input bits which are packages of 8 bits are grouped so that at the output we get packages of 6 bits; second each package of 6 bits is converted to decimal. Finally, the decimal value is converted to the respective character using the previous coding table. If the number of input bits is not a multiple of six, zeros are used to create full packages. If one package contains only zeros, the equal sign is used. La figura de abajo muestra cómo opera la codificación Base 64. Primero, los bits de entrada los cuales son paquetes de 8 bits son agrupados para que a la salida se tengan paquetes de 6 bits; segundo, cada paquete de 6 bits se convierte a decimal. Finalmente, el valor decimal se convierte a un carácter usando la tabla de codificación previa. Si el número de bits de entrada no es un múltiplo de seis, se usan ceros para crear paquetes completos. Si un paquete contiene solamente ceros, el signo de igual se usa. |
Tip |
The figure below shows a simple example how to code the input string Hello. First, each character is converter to binary. Second, 8 groups of six bits are created using the formula shown. Finally, the coding table is used to produce the output string. La figura de abajo muestra un ejemplo sencillo de como codificar la cadena de entrada Hello. Primero, cada letra se convierte a binario. Segundo, ocho grupos de seis bits son creados usando la fórmula mostrada. Finalmente, la tabla de codificación es usada para producir la cadena de salida. |
Problem 1 |
Base 64 coding has 64 symbols. (a) How many bits can be sent in each Base 64 symbol? (b) A PDF file has a size of 4096 bytes, if the file will be coded using Base 64, how many bytes will the coded file occupy? La codificación 64 tiene 64 símbolos. (a) Cuantos bits pueden enviarse en cada símbolo Base 64? (b) Un archivo PDF tiene un tamaño de 4096 bytes, si el archivo se codificará usando la Base 64, cuantos bytes ocupará el archivo codificado? |
Problem 2 |
Create a Wintempla Dialog application called Coder to convert an input data to Base 64. Your program must have a class called Base64 in its implementation. Do not forget that your program works with wstring or wchar_t (2 bytes per character), while the coding requires only one byte per character. You may use online base64 encoders to test your program (i.e., https://www.base64encode.org/.) You may also use the examples in Wikipedia for testing. Cree una aplicación de Diálogo de Wintempla llamada Coder para convertir una entrada de datos a Base 64. Su programa debe tener una clase llamada Base64 en su implementación. No se olvide que su programa trabaja con wstring o wchar_t (2 bytes por letra), mientras que la codificación requiere solamente un byte por letra. Usted puede utilizar codificadores en línea para probar su programa (i.e., https://www.base64encode.org/.) Usted puede usar los ejemplos de Wikipedia para prueba. |
Coder.cpp |
#include "stdafx.h" //________________________________________ Coder.cpp #include "Coder.h" int APIENTRY wWinMain(HINSTANCE hInstance, HINSTANCE , LPTSTR cmdLine, int cmdShow){ Coder app; return app.BeginDialog(IDI_CODER, hInstance); } void Coder::Window_Open(Win::Event& e) { } void Coder::btConvert_Click(Win::Event& e) { //____________________________________ Get and convert input data to 1 byte per character string input; Sys::Convert::WstringToString(tbxInput.Text, input); // string output; wstring woutput; Base64 base; base.Convert(input, output); //___________________________________ Convert each character to two bytes Sys::Convert::StringToWstring(output, woutput); //___________________________________ Display output tbxOutput.Text = woutput; } |
Base64.cpp |
void Base64::Convert(const string& input, string& output) { char table[] = {'A', 'B', 'C', 'D', 'E', 'F', 'G', 'H', 'I', 'J', 'K', 'L', 'M', 'N', 'O', 'P', 'Q', 'R', 'S', 'T', 'U', 'V', 'W', 'X', 'Y', 'Z', 'a', 'b', 'c', 'd', 'e', 'f', 'g', 'h', 'i', 'j', 'k', 'l', 'm', 'n', 'o', 'p', 'q', 'r', 's', 't', 'u', 'v', 'w', 'x', 'y', 'z', '0', '1', '2', '3', '4', '5', '6', '7', '8', '9', '+', '/'}; //_________________________ Get the first six bits char c1 = input[0]; // First eight bits: 0100 0111 char bits = c1 & 0xFC; // Set c1 to zero the last two bits: 0100 0100 int x1 = (bits) >> 2; // Shift to the right: 0001 0001 output += table[x1]; // Get the code from the lookup table //_________________________ Get the second six bits char c2 = input[1]; // Second eight bits: 1001 1101 bits = c1 & 0x03; // Set c1 to zero the first six bits: 0000 0011 x1 = bits << 4; // Shift to the left: 0011 0000 bits = c2 & 0xF0; // Set c2 to zero the last four bits: 1001 0000 int x2 = bits >> 4; // Shift to the right: 0000 1001 x1 = x1 | x2; // 0011 0000 | 0000 1001 = 0011 1001 output += table[x1]; // Get the code from the lookup table ... } |
Tip |
Note that 3 packets of 8 bits at the input of the coder will produce 4 packets of 6 bits at the output. Observe que 3 paquetes de 8 bits en la entrada del codificador 64 originarán 4 paquetes de 6 bits a la salida. |
URL Encoding (Percent Encoding) |
It converts a sequence of characters into a format that can be transmitted over the Internet. This type of encoding uses only the following symbols:
Este convierte una secuencia de caracteres en un formato que puede ser transmitido en la Internet. Este tipo de codificación utiliza solamente los siguientes símbolos:
|
Problem 3 |
Create a Wintempla Dialog application called MyHex to test URL encoding. Cree una aplicación Wintempla de Diálogo llamada MyHex para probar la codificación del tipo URL. |
MyHex.cpp |
... void MyHex::Window_Open(Win::Event& e) { } void MyHex::tbxInput_Change(Win::Event& e) { //___________________________________________ 1. Extract Input wstring input = tbxInput.Text; //___________________________________________ 2. URL Encoding string encoded; Sys::Convert::UrlEncode(input.c_str(), true, encoded); wstring wencoded; Sys::Convert::StringToWstring(encoded, wencoded); tbxEncoded.Text = wencoded; //___________________________________________ 3. URL Decoding wstring restored; Sys::Convert::UrlDecode(encoded.c_str(), restored); tbxRestored.Text = restored; } |
Tip |
To encode and decode Base64, you can use Sys::Convert::Base64BitEncode and Sys::Convert::Base64Decode respectively. Para codificar y decodificar Base64, usted puede usar Sys::Convert::Base64BitEncode y Sys::Convert::Base64Decode respectivamente. |