Base64

    -- Sebastian Pawlak, 2004.



Kod źródłowy pliku "base64.h":

/* base64: biblioteka funkcji pozwalajacych na konwersje lancucha bajtow
 *         do base64 i na odwrot
 *
 * Sebastian Pawlak, 2004-07-03.
 */
#ifndef _BASE64_H_
#define _BASE64_H_

void encodeBase64(const unsigned char *s, char *t, int len);
void decodeBase64(const char *s, unsigned char *t);

#endif

Kod źródłowy pliku "base64.c":

/* base64: biblioteka funkcji pozwalajacych na konwersje lancucha bajtow
 *         do base64 i na odwrot
 *
 * Sebastian Pawlak, 2004-07-03.
 */
#include <string.h>

const char base64[] = "ABCDEFGHIJKLMNOPQRSTUVWXYZ"
                      "abcdefghijklmnopqrstuvwxyz"
                      "0123456789"
                      "+/";

/* encodeBlock: koduje blok trzech bajtow na cztery znaki wg. tablicy base64
 */
void encodeBlock(const unsigned char in[3], char out[4], int len)
{
    out[0] = base64[in[0] >> 2];
    out[1] = base64[((in[0] & 0x03) << 4) | (in[1] >> 4)];
    out[2] = (len > 1) ? (base64[((in[1] & 0x0f) << 2) | (in[2] >> 6)]) : '=';
    out[3] = (len > 2) ? (base64[in[2] & 0x3f]) : '=';
}


/* encodeBase64: koduje zadany lancuch bajtow do base64
 */
void encodeBase64(const unsigned char *s, char *t, int len)
{
    int i;

    for (i = 0; i < len / 3; i++)
        encodeBlock(&s[i * 3], &t[i * 4], 3);

    if (len - i * 3 > 0) {
        encodeBlock(&s[i * 3], &t[i * 4], len - i * 3);
        i++;
    }

    t[i * 4] = '\0';
}


/* decodeBlock: odkodowuje blok czterech znakow w base64 na trzy bajty
 */
void decodeBlock(const char in[4], unsigned char out[3])
{
    char inTmp[4] = { 0 };
    int i;
    char *p;

    for (i = 0; i < 4; i++)
        if ((p = strchr(base64, in[i])) != NULL)
            inTmp[i] = p - base64;

    out[0] = (inTmp[0] << 2) | (inTmp[1] >> 4);

    out[1] = (inTmp[1] << 4) | (inTmp[2] >> 2);
    if (out[1] == '\0')
        return;

    out[2] = (inTmp[2] << 6) | (inTmp[3]);
}


/* decodeBase64: odkodowuje zadany lancuch znakow w base64;
 *               napotkanie blednego bajtu, konczy odkodowywanie;
 *               dlugosc wejsciowego lancucha znakow musi dzielic sie przez 4
 */
void decodeBase64(const char *s, unsigned char *t)
{
    int i;

    for (i = 0; i < strlen(s) / 4; i++)
        decodeBlock(&s[i * 4], &t[i * 3]);

    if (s[i * 4 - 1] != '=')
        t[i * 3] = '\0';
}

Kod źródłowy pliku "test.c":

/* test.c: ilustracja dzialania funkcji Base64
 * Sebastian Pawlak, 2004-07-03
 */
#include <stdio.h>
#include <string.h>
#include "base64.h"

int main(void)
{
    char t[] = "ala ma kota";
    char w[64], q[64];

    fprintf(stdout, "oryginalny: %s\n", t);

    encodeBase64(t, w, strlen(t));
    fprintf(stdout, "zakodowany: %s\n", w);

    decodeBase64(w, q);
    fprintf(stdout, "odkodowany: %s\n", q);

    return 0;
}
w3cw3c
automatyka przemysłowa