The mysterious case of the missing Base64 library

This page was created on Sun Mar 27 2011 and last changed on Sat Oct 05 2024.

Many versions of base 64 encoding and decoding can be found on the Internet, but if you would like to use a system one, here is how to access the FreeBSD one. There isn't a documented library for the Base 64 encoding, but there is a base 64 encoder and decoder in the C library. The library functions are __b64_ntop and __b64_pton. They read and write to user buffers with specified lengths. Here is an example program which encodes and then decodes the command line:

#include <stdio.h>
#include <string.h>

#define b64_ntop __b64_ntop
#define b64_pton __b64_pton
/* There are no header files for these functions. */

int b64_ntop(unsigned char const *src, size_t srclength,
             char *target, size_t targsize);
int b64_pton(char const *src, unsigned char *target, size_t targsize);

/* Demonstrate the use of the functions by encoding and decoding the
   command line arguments. */

#define targsize 0x100
int main (int argc, char ** argv)
{
    int i;
    char target[targsize];
    unsigned char revert[targsize];
    for (i = 0; i < argc; i++) {
        int end;
        /* Input buffer, input length, output buffer, max output length */
        b64_ntop ((unsigned char*) argv[i], strlen (argv[i]), target, targsize);
        printf ("%s\n", target);
        /* Input buffer (null terminated), output buffer, max output length. */
        end = b64_pton (target, revert, targsize);
        revert[end] = '\0';
        printf ("%s\n", revert);
    }
    return 0;
}

(download)

The functions aren't documented anywhere, and there doesn't seem to be any header file you can use. There is a header file resolv.h which defines them, but it seems like this include file requires other include files to also be included before it. I don't know if there is a better way to call this function.

The output from the example program looks like this:

$ ./a.out slicey slicey oncey twicey         
Li9hLm91dA==
./a.out
c2xpY2V5
slicey
c2xpY2V5
slicey
b25jZXk=
oncey
dHdpY2V5
twicey

Copyright © Ben Bullock 2009-2024. All rights reserved. For comments, questions, and corrections, please email Ben Bullock (benkasminbullock@gmail.com). / Privacy / Disclaimer