A KISS pure Fortran 2003+ library for encoding and decoding any intrinsic type — integers, reals, characters, and unlimited polymorphic variables — to and from Base64 strings.
| 🔢 All intrinsic types Integers I1P–I8P, reals R4P/R8P/opt. R16P, characters, unlimited polymorphic |
📐 Scalars & arrays Scalar and rank-1 array support for all types |
🔗 Pack mixed data Heterogeneous arrays via pack_data |
🔄 Bidirectional Symmetric encode and decode |
|---|---|---|---|
🎯 KISS APIb64_init, b64_encode, b64_decode — that's it |
⚡ Pure Fortran 2003+ No C, no external deps; tested with gfortran & ifort |
🔧 Two build systems fpm and FoBiS.py — static, shared, and test modes |
🔓 Open & documented GPL v3 · BSD · MIT; full API reference & usage guide |
For full documentations (guide, tutorial, examples, etc...) see the BeFoR64 website.
- Stefano Zaghi — @szaghi
Contributions are welcome — see the Contributing page.
This project is distributed under a multi-licensing system:
- FOSS projects: GPL v3
- Closed source / commercial: BSD 2-Clause, BSD 3-Clause, or MIT
Anyone interested in using, developing, or contributing to this project is welcome — pick the license that best fits your needs.
use befor64
call b64_init()
character(len=:), allocatable :: code
call b64_encode(n=1.0_R8P, code=code) ! encode a scalar real
call b64_encode(n=[1_I4P, 2_I4P], code=code) ! or an integer array
real(R8P) :: val
call b64_decode(code='AAAAAAAA8D8=', n=val) ! decode backBeFoR64 exposes four public procedures and one flag:
| Symbol | Description |
|---|---|
b64_init |
Initialise the library — call once before any encode/decode |
is_b64_initialized |
Logical flag, true after b64_init |
b64_encode / b64_encode_up |
Encode intrinsic or unlimited polymorphic variable to Base64 |
b64_decode / b64_decode_up |
Decode a Base64 string back to an intrinsic or polymorphic variable |
pack_data |
Pack two numeric arrays of different kinds into a byte stream for mixed-type encoding |
Encoded strings are returned as character(len=:), allocatable — a Fortran 2003 feature required by the compiler.
! heterogeneous data: pack first, then encode
real(R8P) :: a(12)
real(R4P) :: b(7)
integer(I1P), allocatable :: packed(:)
character(len=:), allocatable :: code
call pack_data(a1=a, a2=b, packed=packed)
call b64_encode(n=packed, code=code)See the full Usage guide for all supported type combinations.
Standalone — clone, build, and install in one command:
FoBiS.py install szaghi/BeFoR64 -mode static-gnu
FoBiS.py install szaghi/BeFoR64 -mode static-gnu --prefix /path/to/prefixAs a project dependency — declare BeFoR64 in your fobos and run fetch:
[dependencies]
deps_dir = src/third_party
PENF = https://github.com/szaghi/BeFoR64FoBiS.py fetch # fetch and build
FoBiS.py fetch --update # re-fetch and rebuildAdd to your fpm.toml:
[dependencies]
BeFoR64 = { git = "https://github.com/szaghi/BeFoR64" }cmake -B build && cmake --build buildmake # static library
make TESTS=yes # build and run tests