aboutsummaryrefslogtreecommitdiff
path: root/content/posts/2026-03-08-pbech32-v0.1.0.md
blob: 7712d2f3581d7babe66c9b174af1e647d1f5646a (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
---
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][] strings.

[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
```

[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]: 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"