aboutsummaryrefslogtreecommitdiff
path: root/content/posts/2026-03-08-pbech32-v0.1.0.md
blob: 4913886aec1770d61e27f5d495865704851f1a80 (plain)
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
121
122
123
124
125
126
127
128
129
130
---
slug: pbech32-v0.1.0
title: "pbech32 v0.1.0"
date: "2026-03-08T02:50:28-04:00"
---
I just released the first version of [pbech32][], a [Rust][] library for
encoding and decoding [Bech32][] data.

[Bech32][] is a fast and user-friendly [base 32][] encoding format
that includes a [namespace][] and [checksum][].

### Links

- [pbech32 Git repository][git repository]
- [pbech32 package on crates.io][crates-io-pbech32]
- [pbech32 API Documentation on docs.rs][docs-rs-pbech32]

### Library Features

- [Bech32 (BIP173)][bip173] and [Bech32m (BIP350)][bip350] support.
- Idiomatic encoding and decoding via the [`Display`][display] and
  [`FromStr`][fromstr] traits.
- Decode arbitrarily long strings.
- Streamed, allocation-free encoding to any [writer][].
- No external dependencies.

### Examples

Decode from string:

```rust
use pbech32::Bech32;

let s = "a1qypqxpq9mqr2hj"; // bech32m-encoded string
let got: Bech32 = s.parse()?; // decode string

assert_eq!(got.hrp.to_string(), "a"); // check human-readable part
assert_eq!(got.data, vec![1, 2, 3, 4, 5]); // check data
```

Encode to string:

```rust
use pbech32::{Bech32, Hrp, Scheme};

let scheme = Scheme::Bech32m; // checksum scheme
let hrp: Hrp = "a".parse()?; // human-readable part
let data = vec![1, 2, 3, 4, 5]; // data
let got = Bech32 { scheme, hrp, data }.to_string(); // encode as string

assert_eq!(got, "a1qypqxpq9mqr2hj"); // check result
```

Encode to a [writer][]:

```rust
use std::io::Write;
use pbech32::{Encoder, Hrp, Scheme};

let mut vec: Vec<u8> = Vec::new(); // output vector
let hrp: Hrp = "hello".parse()?; // human readable part

let mut encoder = Encoder::new(&mut vec, Scheme::Bech32m, hrp)?; // create encoder
encoder.write_all(b"folks")?; // write data
encoder.flush()?; // flush encoder (REQUIRED)

let got = str::from_utf8(vec.as_ref())?; // convert output vector to string
assert_eq!(got, "hello1vehkc6mn27xpct"); // check result
```
&nbsp;

More examples are available in the [`examples/` directory][examples] of
the [pbech32 Git repository][git repository].

[bech32]: https://github.com/bitcoin/bips/blob/master/bip-0173.mediawiki
  "Bech32 (BIP173)"
[bech32m]: https://github.com/bitcoin/bips/blob/master/bip-0350.mediawiki
  "Bech32m (BIP350)"
[bip173]: https://github.com/bitcoin/bips/blob/master/bip-0173.mediawiki
  "BIP173 (Bech32)"
[bip350]: https://github.com/bitcoin/bips/blob/master/bip-0350.mediawiki
  "BIP350 (Bech32m)"
[ascii]: https://en.wikipedia.org/wiki/ASCII
  "ASCII (Wikipedia)"
[base 32]: https://en.wikipedia.org/wiki/Base32
  "Base 32 (Wikipedia)"
[checksum]: https://en.wikipedia.org/wiki/Checksum
  "Checksum (Wikipedia)"
[namespace]: https://en.wikipedia.org/wiki/Namespace
  "Namespace (Wikipedia)"
[bch code]: https://en.wikipedia.org/wiki/BCH_code
  "BCH code (Wikipedia)"
[alphabet]: https://github.com/bitcoin/bips/blob/master/bip-0173.mediawiki#bech32
  "BIP173: Specification: Bech32"
[writer]: https://doc.rust-lang.org/std/io/trait.Write.html
  "writer"
[age encryption]: https://age-encryption.org/
  "age encryption"
[html]: https://en.wikipedia.org/wiki/HTML
  "HyperText Markup Language"
[rust]: https://rust-lang.org/
  "Rust programming language."
[git repository]: https://github.com/pablotron/pbech32
  "pbech32 git repository"
[pbech32]: https://github.com/pablotron/pbech32
  "pbech32 Rust library"
[cargo]: https://doc.rust-lang.org/cargo/
  "Rust package manager"
[podman]: https://podman.io/
  "Podman container management tool"
[docker]: https://docker.com/
  "Docker container management tool"
[api]: https://en.wikipedia.org/wiki/API
  "Application Programming Interface (API)"
[linter]: https://en.wikipedia.org/wiki/Lint_(software)
  "Static code analysis tool to catch common mistakes"
[crates.io]: https://crates.io/
  "Rust package registry"
[docs-rs-pbech32]: https://docs.rs/pbech32
  "pbech32 API documentation on docs.rs"
[crates-io-pbech32]: https://crates.io/crates/pbech32
  "pbech32 on crates.io"
[examples]: https://github.com/pablotron/pbech32/tree/main/examples
  "pbech32 examples/ directory"
[cargo-tarpaulin]: https://crates.io/crates/cargo-tarpaulin
  "Tarpaulin code coverage reporting tool."
[display]: https://doc.rust-lang.org/std/fmt/trait.Display.html
  "std::fmt::Display trait"
[fromstr]: https://doc.rust-lang.org/std/str/trait.FromStr.html
  "std::str::FromStr trait"