public static byte[] decode(String input) throws Exception { byte[] bytes = decodeToBigInteger(input).toByteArray(); // We may have got one more byte than we wanted, if the high bit of the // next-to-last byte was not zero. This // is because BigIntegers are represented with twos-compliment notation, thus if // the high bit of the last // byte happens to be 1 another 8 zero bits will be added to ensure the number // parses as positive. Detect // that case here and chop it off. boolean stripSignByte = bytes.length > 1 && bytes[0] == 0 && bytes[1] < 0; // Count the leading zeros, if any. int leadingZeros = 0; for (int i = 0; input.charAt(i) == ALPHABET.charAt(0); i++) { leadingZeros++; } // Now cut/pad correctly. Java 6 has a convenience for this, but Android can't // use it. byte[] tmp = new byte[bytes.length - (stripSignByte ? 1 : 0) + leadingZeros]; System.arraycopy(bytes, stripSignByte ? 1 : 0, tmp, leadingZeros, tmp.length - leadingZeros); return tmp; }