Thanks to visit codestin.com
Credit goes to lib.rs

#unicode #base256 #unicode-encoding #no-std

no-std bin+lib b256

Dense byte to unicode character encoding

11 unstable releases (3 breaking)

Uses new Rust 2024

0.4.1 Sep 19, 2025
0.4.0 Sep 19, 2025
0.3.1 Sep 19, 2025
0.2.3 Sep 18, 2025
0.1.2 Sep 18, 2025

#1832 in Encoding

Codestin Search App Codestin Search App Codestin Search App Codestin Search App Codestin Search App

253 downloads per month

MIT/Apache

24KB
474 lines

base256

Dense byte-to-unicode encoding. 32 bytes → 32 characters.

// Before: Debug output for [u8; 32]
[58, 216, 165, 65, 124, 141, 110, 247, 71, 125, 151, 247, 52, 203, 133, 41,
 110, 37, 2, 225, 199, 129, 236, 58, 239, 142, 11, 154, 90, 205, 222, 11]

// After: base256 encoding
ЩóΓÎLÄμöÊLχ9ρÞ4ωÒmiЁBøάЩηÄθÓψÏÇΔa

Install

Library:

cargo add b256

CLI:

cargo install b256

Use

Library:

use b256::Base256;

// Basic encoding/decoding
let key = [0u8; 32];
let encoded = Base256::encode(&key);  // 111111111111111111111111111111111
let decoded = Base256::decode(&encoded).unwrap();

// String parsing (new in 0.4.0)
let valid = Base256::is_valid("ЩóΓÎLÄμöÊLχ9ρÞ4ωÒmiЁBøάЩηÄθÓψÏÇΔa");
let bytes = Base256::parse("ЩóΓÎLÄμöÊLχ9ρÞ4ωÒmiЁBøάЩηÄθÓψÏÇΔa").unwrap();

// Hex conversions
let hex_bytes = Base256::to_hex(&encoded).unwrap();  // [48, 48, 48, ...] (64 bytes)
let from_hex = Base256::from_hex(&hex_bytes).unwrap();  // back to base256

// Direct byte-hex conversions
let hex = Base256::bytes_to_hex(&key);  // "0000...0000" as bytes
let bytes = Base256::hex_to_bytes(&hex).unwrap();

CLI:

# Encode stdin to base256 (default)
head -c 32 /dev/urandom | base256

# Decode base256 to raw bytes
echo 'ЩóΓÎLÄμöÊLχ9ρÞ4ωÒmiЁBøάЩηÄθÓψÏÇΔa' | base256 -d | xxd

# Encode to hex
head -c 32 /dev/urandom | base256 -x

# Convert hex to base256
echo '3ad8a5417c8d6ef7477d97f734cb85296e2502e1c781ec3aef8e0b9a5acdde0b' | base256 -X

# Convert base256 to hex
echo 'ЩóΓÎLÄμöÊLχ9ρÞ4ωÒmiЁBøάЩηÄθÓψÏÇΔa' | base256 -dx

# SSH public key to base256
awk '{print $2}' ~/.ssh/id_ed25519.pub | base64 -d | tail -c32 | base256

Design

  • true 1:1 mapping: 32 bytes → 32 characters (always)
  • shell-safe: Base58 core avoids ALL shell metacharacters
  • no-std: Zero dependencies, zero allocations
  • type-safe: Use [char; 32] arrays, not variable-length strings

Character set (256 total):

  • Base58 alphabet (58) - proven shell-safe
  • Latin-1 letters (68) - no symbols
  • Greek alphabet (64) - full set
  • Cyrillic letters (66) - Russian alphabet

When to use

Use base256 for:

  • Ed25519/Curve25519 public keys
  • SHA-256 hashes in terminal output
  • Any 32-byte value displayed to humans

Use hex for:

  • Maximum compatibility
  • Machine-to-machine protocols
  • Debugging binary data

Examples

# Generate ed25519 public key identifier
openssl genpkey -algorithm ed25519 | \
  openssl pkey -pubout -outform DER | \
  tail -c32 | \
  base256

# Output: sοΤQÞвύώБρÄUÁπΨQΞeRϊyϏjϋнХÀēāÄnт

# Compare all encodings
KEY=$(head -c32 /dev/urandom)
echo "$KEY" | base256    # 32 chars: ΓΨΒωυ...
echo "$KEY" | base64     # 44 chars: P6iy1p...==
echo "$KEY" | xxd -p     # 64 chars: 3ad8a5...

License

MIT OR Apache-2.0

No runtime deps

Features