Coding


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  
0A
1B
2C
3D
4E
5F
6G
7H
8I
9J
10K
11L
12M
13N
14O
15P
16Q
17R
18S
19T
20U
21V
22W
23X
24Y
25Z
26a
27b
28c
29d
30e
31f
32g
33h
34i
35j
36k
37l
38m
39n
40o
41p
42q
43r
44s
45t
46u
47v
48w
49x
50y
51z
520
531
542
553
564
575
586
597
608
619
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.

coding

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.

example

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.

CoderRun1

CoderRun2

CoderRun3

CoderRun4

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:
  • Any character from a to z
  • Any character from A to Z
  • Any character from 0 to 9
  • Dot, dash, underscore and tilde
All other remaining characters are replaced with a percent sign followed by two hexadecimal digits. Any space is replaced with a plus sign. You can use online encoders to test this type of encoding, such as: https://www.url-encode-decode.com/.
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:
  • Cualquier caracter de la a a la z
  • Cualquier caracter de la A a la Z
  • Cualquier caracter del 0 al 9
  • Punto, guión, guión bajo y tilde.
Todos los otros caracteres restantes son remplazados con un signo de porcentaje seguido de dos dígitos hexadecimales. Cualquier espacio es remplazado con un signo de más. Usted puede utilizar codificadores en línea para probar este tipo de codificación, tales como: https://www.url-encode-decode.com/.

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.

MyHexRun

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.

© Copyright 2000-2019 Wintempla selo. All Rights Reserved. Sep 05 2019. Home