CrockfordBase32.java (1134B)
1 package net.taler.donauverificator.network; 2 3 /** 4 * Minimal encoder for the Crockford Base32 alphabet as specified for Donau. 5 * Padding is omitted because the Donau specification does not require it. 6 */ 7 public final class CrockfordBase32 { 8 9 private static final char[] ALPHABET = "0123456789ABCDEFGHJKMNPQRSTVWXYZ".toCharArray(); 10 11 private CrockfordBase32() { 12 } 13 14 public static String encode(byte[] data) { 15 if (data == null || data.length == 0) { 16 return ""; 17 } 18 StringBuilder encoded = new StringBuilder((data.length * 8 + 4) / 5); 19 int buffer = 0; 20 int bitsLeft = 0; 21 for (byte value : data) { 22 buffer = (buffer << 8) | (value & 0xFF); 23 bitsLeft += 8; 24 while (bitsLeft >= 5) { 25 int index = (buffer >> (bitsLeft - 5)) & 0x1F; 26 bitsLeft -= 5; 27 encoded.append(ALPHABET[index]); 28 } 29 } 30 if (bitsLeft > 0) { 31 int index = (buffer << (5 - bitsLeft)) & 0x1F; 32 encoded.append(ALPHABET[index]); 33 } 34 return encoded.toString(); 35 } 36 }