MAN.9FRONT.ORG RTFM


     ENCODE(2)                                               ENCODE(2)

     NAME
          dec64, enc64, dec32, enc32, dec16, enc16, dec64x, enc64x,
          dec32x, enc32x, dec64chr, enc64chr, dec32chr, enc32chr,
          dec16chr, enc16chr, encodefmt - encoding byte arrays as
          strings

     SYNOPSIS
          #include <u.h>
          #include <libc.h>

          int  dec64(uchar *out, int lim, char *in, int n)

          int  dec64x(uchar *out, int lim, char *in, int n, int
          (*map)(int))

          int  enc64(char *out, int lim, uchar *in, int n)

          int  enc64x(char *out, int lim, uchar *in, int n, int
          (*map)(int))

          int  dec32(uchar *out, int lim, char *in, int n)

          int  dec32x(uchar *out, int lim, char *in, int n, int
          (*map)(int))

          int  enc32(char *out, int lim, uchar *in, int n)

          int  enc32x(char *out, int lim, uchar *in, int n, int
          (*map)(int))

          int  dec16(uchar *out, int lim, char *in, int n)

          int  enc16(char *out, int lim, uchar *in, int n)

          int  dec64chr(int c)

          int  enc64chr(int o)

          int  dec32chr(int c)

          int  enc32chr(int o)

          int  dec16chr(int c)

          int  enc16chr(int o)

          int  encodefmt(Fmt*)

     DESCRIPTION
          The functions described here handle encoding and decoding of

     ENCODE(2)                                               ENCODE(2)

          bytes to printable ASCII strings as specified by RFC4648.

          Enc16, enc32 and enc64 create null terminated strings.  They
          return the size of the encoded string (without the null) or
          -1 if the encoding fails.  The encoding fails if lim, the
          length of the output buffer (including null), is too small.

          Dec16, dec32 and dec64 return the number of bytes decoded or
          -1 if the decoding fails.  The decoding fails if the output
          buffer is not large enough or, for base 32, if the input
          buffer length is not a multiple of 8.

          Dec16chr, dec32chr and dec64chr return the value for a sym-
          bol of the alphabet or -1 when the symbol is not in the
          alphabet.

          Enc16chr, enc32chr and enc64chr encode a symbol of the
          alphabet given a value.  if the value is out of range then
          zero is returned.

          The enc64x and enc32x variants are identical to the above,
          except that they take a function mapping from an arbitrary
          index in the alphabet to the encoded character.  For exam-
          ple, in the following 32-character alphabet,
          ABCDEFGHIJKLMNOPQRSTUVWXYZ234567
          the chr function would map the value 3 to the character D.

          The dec64x and dec32x variants are similar to the above,
          however the function passed maps from a character within the
          alphabet to the index within the alphabet.

          Encodefmt can be used with fmtinstall(2) and print(2) to
          print encoded representations of byte arrays.  The verbs are

          H    base 16 (i.e. hexadecimal). The default encoding is in
               upper case.  The l flag forces lower case.

          <    base 32. The default is upper case, same as H.

          [    base 64 (same as MIME)

          The length of the array is specified as f2. For example, to
          display a 15 byte array as hex:

              char x[15];

              fmtinstall('H', encodefmt);
              print("%.*H\n", sizeof x, x);

     SOURCE

     ENCODE(2)                                               ENCODE(2)

          /sys/src/libc/port/u16.c
          /sys/src/libc/port/u32.c
          /sys/src/libc/port/u64.c
          /sys/src/libc/port/encodefmt.c

     HISTORY
          In Jan 2018, base 32 encoding was changed from non-standard
          to standard RFC4648 alphabet.

          old: 23456789abcdefghijkmnpqrstuvwxyz

          new: ABCDEFGHIJKLMNOPQRSTUVWXYZ234567