RFC 4648-compliant Base16 encodings/decodings

Version on this page:
LTS Haskell 22.22:1.0@rev:1
Stackage Nightly 2024-05-22:1.0@rev:1
Latest on Hackage:1.0@rev:1

See all snapshots base16 appears in

BSD-3-Clause licensed by Emily Pillmore
Maintained by [email protected]
This version can be pinned in stack with:base16-,2183

Module documentation for

Used by 1 package in lts-16.31(full list with versions):


Build Status Hackage

RFC 4648-compliant Base16 encoding and decoding.

For the companion optics and pattern synonyms, see base16-lens.


The following types are supported for Hex alphabet codecs:

  • Data.ByteString
  • Data.ByteString.Lazy
  • Data.ByteString.Short
  • Data.Text
  • Data.Text.Lazy
  • Data.Text.Short

Additionally this library has

  • Much better performance than base16-bytestring for encode and decode, with a more conventional api.
  • Optics for handling more complex structures with Base64 representations via the base16-lens package
  • Checks for both validity and correctness of Base16 encodings.

There are no dependencies aside from those bundled with GHC.


Revision history for base16

  • Improved performance. Decode and encode are now 3.5x-5x the next best lib.


  • Add lenient decoders
  • Fix bug in Text decodeBase16 which failed on invalid UTF-8 values as a result of decoding
  • Add decodeBase16With combinators


  • Add lazy variants for Text and ByteString values – 2020-02-17

  • Documentation now references correct RFC section

0.1.2 – 2020-02-17

  • Unmask loops - now correct.

0.1.1 – 2020-02-17

  • Mask Word32 and Word64 loops (flaky) – 2020-02-16

  • First version. Released on an unsuspecting world.