rfc.base64
- Base64 encoding/decoding ¶This module defines a few functions to encode/decode Base64 format, defined in RFC 4648 (https://www.ietf.org/rfc/rfc4648.txt). It also supports Base32 and Base16 formats defined in it as well.
The common naming convention is as follows.
encoding-encode, encoding-decode
Port-based encoder/decoder. It reads input from the current input port, and emits encoded/decoded output to the current output port.
encoding-encode-message
Takes the input as either a string or a u8vector, and returns the encoded result as a string. Note that BaseN encoding always results readable strings.
encoding-decode-string-to
Takes the encoded string, and returns the result in either a u8vector or a string, as specified by the target argument. Note that the decoded result is a byte sequence in general, so a string may be incomplete.
{rfc.base64
}
Reads byte stream from the current input port, encodes it in Base64
format and writes the result character stream to the current output port.
The conversion ends when it reads EOF from the current input port.
Newline characters can be inserted to keep the maximum line width to
the value given to the line-width keyword argument. The default
value of line-width is 76, as specified in RFC2045. You can give
#f
or zero to line-width to suppress line splitting.
Base64 can have different mappings in the digit of 62 and 63; the “standard”
encoding uses +
and /
, and the “url-safe” encoding
uses -
and _
. You can specify which to use by either
url-safe or digits.
If a true value is given to url-safe,
the input bytes will be encoded with “url-safe” encoding.
Otherwise, you can give a two-letter string to digits argument,
in which case the first character is used for digit 62 and the
second character is used for digit 63. The digits argument
is added to support SRFI-207 (see srfi.207
- String-notated bytevectors).
If a true value is given to omit-padding, the trailing
padding characters (#\=
) are omitted.
(See RFC4648 Section 3.2 (https://www.rfc-editor.org/rfc/rfc4648#section-3.2)). The default is not omitting padding characters.
{rfc.base64
}
Encodes message, which must be either a string or a u8vector,
with Base64 encoding and returns the result as a string.
The meaning of keyword arguments are the same as base64-encode
above.
(base64-encode-message "Hau'oli makahiki hou") ⇒ "SGF1J29saSBtYWthaGlraSBob3U="
For the portable code, you may want to use bytestring->base64
in srfi.207
(see srfi.207
- String-notated bytevectors).
{rfc.base64
}
Reads character stream from the current input port, decodes it from Base64
format and writes the result byte stream to the current output port.
The conversion ends when it reads EOF or the termination character
(=
).
The characters which does not in legal Base64 encoded character set are silently ignored by default. If a true value is given to the strict keyword argument, however, non-whitespace out-of-set characters in the input raises an error.
The input can lack the trailing padding character by default. However, if strict argument is true, an error is thrown unless the input has a proper number of padding characters.
The digits and url-safe keyword arguments can be used
to choose different mappings of digit 62 and 63. See base64-encode
above for the details.
{rfc.base64
}
The target argument must be a class object <string>
or <u8vector>
.
This procedure takes Base64-encoded input string, and returns the
decoded result as an instance of target.
The meaning of keyword arguments are the same as base64-decode
above.
(base64-decode-string-to <string> "SGF1J29saSBtYWthaGlraSBob3U=") ⇒ "Hau'oli makahiki hou" (base64-decode-string-to <u8vector> "SGF1J29saSBtYWthaGlraSBob3U=") ⇒ #u8(72 97 117 39 111 108 105 32 109 97 107 97 104 105 107 105 32 104 111 117)
Note that if you ask a string to be returned, the result may be an incomplete string.
(base64-decode-string-to <string> "8PHy8w==") ⇒ #**"\xf0;\xf1;\xf2;\xf3;"
For the portable code, you may want to use base64->bytestring
in srfi.207
(see srfi.207
- String-notated bytevectors).
RFC4648 defines two completely different encodings as base-32;
The standard Base32 uses A-Z
for 0 to 25, and 2-7
for 26 to 31. The “base32hex” variant uses
0-9
for 0 to 9, and A-V
for 10 to 31.
Since RFC states the latter should not be referred to as base32,
we provide separate procedures for those encodings.
{rfc.base64
}
The procedures are port-based; they read input from the
current standard port, and emits the base32 or base32hex
encoded result to the current output port.
The keyword arguments omit-padding and line-width are
the same as base64-encode
.
{rfc.base64
}
Base32 or Base32hex encode message, which should be a string or a u8vector,
and returns the result in a string.
The keyword arguments omit-padding and line-width are
the same as base64-encode
.
(base32-encode-message "Hau'oli makahiki hou!") ⇒ "JBQXKJ3PNRUSA3LBNNQWQ2LLNEQGQ33VEE======" (base32hex-encode-message "Hau'oli makahiki hou!") ⇒ "91GNA9RFDHKI0RB1DDGMGQBBD4G6GRRL44======"
{rfc.base64
}
Read Base32/Base32hex encoded string from the current input port,
and emits the decoded result to the current output port.
If a true value is given to the strict argument,
an error is thrown if non-whitespace illegal characters exist
in the input, or the proper padding characters are missing.
The default of strict is #f
and illegal characters
are just ignored.
{rfc.base64
}
Decode a Base32/Base32hex encoded string string, and
returns the result as an instance of class target, which
must be either <u8vector>
or <string>
.
The meaning of strict argument is the same as
in base32-decode
.
(base32-decode-string-to <string> "JBQXKJ3PNRUSA3LBNNQWQ2LLNEQGQ33VEE======") ⇒ "Hau'oli makahiki hou!"
Base16 is simply the hexadecimal encoding of input octets.
RFC4648 defines to use uppercase letters A-F
for digits
10 to 15. In practice, lowercase letters are also used
for hexadecimal encoding, so we provide that option, too.
{rfc.base64
}
Read data from the current input port, and emits Base16 encoded
result to the current output port.
By default, A-F
are used for digit 10 to 15, as specified
in RFC4648. If lowercase argument is given and true,
a-f
are used instead.
Note that no padding character is ever generated in Base16 encoding.
{rfc.base64
}
Base16 encode message, which should be a string or a u8vector,
and returns the result in a string. The lowercase argument
is the same as base16-encode
.
(base16-encode-message "Aloha") ⇒ "416C6F6861" (base16-encode-message "Aloha" :lowercase #t) ⇒ "416c6f6861"
{rfc.base64
}
Read Base16 encoded string from the current input port,
and emits the decoded result to the current output port.
By default, characters other than Base16 digits are ignored,
and both upperase and lowercase alphabets are recognized.
If strict argument is given and true, however,
characters other than #[0-9A-F]
throws an error.
{rfc.base64
}
Decode Base16-encoded string string, and returns
the result as an instance of class target, which must
be either <u8vector>
or <string>
.
The strict argument is the same as base16-decode
.
(base16-decode-string-to <u8vector> "416c6f6861") ⇒ #u8(65 108 111 104 97) (base16-decode-string-to <string> "416c6f6861") ⇒ "Aloha"
The following API is deprecated. Avoid using them in new code.
{rfc.base64
}
Deprecated.
Converts contents of string/u8vector to Base64 encoded format.
For base64-encode-string
,
input string can be either complete or incomplete string;
it is always interpreted as a byte sequence.
The digits and url-safe arguments are the same as
base64-encode
.
{rfc.base64
}
Deprecated.
Decodes a Base64 encoded string string and returns
the result as a string or a u8vector, respectively.
The conversion terminates at the end of string or
the termination character (=
).
The characters which are not in legal Base64 encoded character set are silently ignored by default. If a true value is given to the strict keyword argument, however, non-whitespace out-of-set characters in the input raises an error.
The digits and url-safe arguments are the same as
base64-encode
.