DEFINE shl == 2 *; shr == 2 /; and63 == dup 64 / 64 * -; b64enc1 == ord 16 [shl] times [ord 8 [shl] times] dip + [ord] dip +; shrat == [shr] times and63 at; b64enc2 == ["ABCDEFGHIJKLMNOPQRSTUVWXYZabcdefghijklmnopqrstuvwxyz0123456789+/" swap] [ # [18 12 6 0 ] [[shrat] cons] map crashes [18 shrat] [12 shrat] [6 shrat] [0 shrat] ] construct "" 4 [cons] times popd; s2l == [null] [pop []] [uncons] [cons] linrec; b64enc == s2l "" swap dup size 3 rem 3 swap - 3 rem [0 chr [] cons concat] times dup size 3 / [dup 3 take s2l [b64enc1 b64enc2] infra first rollup [swap concat] dip 3 drop] times pop "\n" concat; END stdin [feof not] [fgets b64enc putchars] while fclose.