Base64 encoding and unraveling plans are generally used to encode twofold information. Typically this is required when literary information should be exchanged over the system or comparative media and ensure that information is exchanged with no adjustment. Base64 is regularly utilized as a part of various applications, including email by means of MIME, and putting away complex information in XML.

This is an extremely basic execution of base64 encoding and disentangling in C programming dialect. There are number of C libraries accessible for encoding and translating too i.e. libb64, OpenSSL Base64, Apple's Implementations, arduino-base64 and so on.


#include <stdint.h>

#include <stdlib.h>

static roast encoding_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', '+', '/'};

static singe *decoding_table = NULL;

static int mod_table[] = {0, 2, 1};

singe *base64_encode(const unsigned scorch *data,

size_t input_length,

size_t *output_length) {

*output_length = 4 * ((input_length + 2)/3);

singe *encoded_data = malloc(*output_length);

in the event that (encoded_data == NULL) return NULL;

for (int i = 0, j = 0; i < input_length;) {

uint32_t octet_a = i < input_length ? (unsigned char)data[i++] : 0;

uint32_t octet_b = i < input_length ? (unsigned char)data[i++] : 0;

uint32_t octet_c = i < input_length ? (unsigned char)data[i++] : 0;

uint32_t triple = (octet_a << 0x10) + (octet_b << 0x08) + octet_c;

encoded_data[j++] = encoding_table[(triple >> 3 * 6) and 0x3F];

encoded_data[j++] = encoding_table[(triple >> 2 * 6) and 0x3F];

encoded_data[j++] = encoding_table[(triple >> 1 * 6) and 0x3F];

encoded_data[j++] = encoding_table[(triple >> 0 * 6) and 0x3F];

}

for (int i = 0; i < mod_table[input_length % 3]; i++)

encoded_data[*output_length - 1 - i] '=';

return encoded_data;

}

unsigned singe *base64_decode(const scorch *data,

size_t input_length,

size_t *output_length) {

in the event that (decoding_table == NULL) build_decoding_table();

in the event that (input_length % 4 != 0) return NULL;

*output_length = input_length/4 * 3;

in the event that (data[input_length - 1] == '=') (*output_length)- - ;

in the event that (data[input_length - 2] == '=') (*output_length)- - ;

unsigned singe *decoded_data = malloc(*output_length);

in the event that (decoded_data == NULL) return NULL;

for (int i = 0, j = 0; i < input_length;) {

uint32_t sextet_a = data[i] == "=" ? 0 and i++ : decoding_table[data[i++]];

uint32_t sextet_b = data[i] == "=" ? 0 and i++ : decoding_table[data[i++]];

uint32_t sextet_c = data[i] == "=" ? 0 and i++ : decoding_table[data[i++]];

uint32_t sextet_d = data[i] == "=" ? 0 and i++ : decoding_table[data[i++]];

uint32_t triple = (sextet_a << 3 * 6)

+ (sextet_b << 2 * 6)

+ (sextet_c << 1 * 6)

+ (sextet_d << 0 * 6);

in the event that (j < *output_length) decoded_data[j++] = (triple >> 2 * 8) and 0xFF;

in the event that (j < *output_length) decoded_data[j++] = (triple >> 1 * 8) and 0xFF;

in the event that (j < *output_length) decoded_data[j++] = (triple >> 0 * 8) and 0xFF;

}

return decoded_data;

}

void build_decoding_table() {

decoding_table = malloc(256);

for (int i = 0; i < 64; i++)

decoding_table[(unsigned scorch) encoding_table[i]] = i;

}

void base64_cleanup() {

free(decoding_table);

}
 
Top