1 package net.sf.openrocket.android.thrustcurve;
\r
3 import java.io.IOException;
\r
4 import java.io.Reader;
\r
5 import java.io.StringReader;
\r
6 import java.io.StringWriter;
\r
8 public abstract class Base64Decoder {
\r
10 private static final String BASE64_CHARS =
\r
11 "ABCDEFGHIJKLMNOPQRSTUVWXYZabcdefghijklmnopqrstuvwxyz0123456789+/";
\r
12 private static final char PAD_CHAR = '=';
\r
14 private final static short[] _charToBits = new short[128];
\r
18 for (int i = 0; i < _charToBits.length; i++)
\r
19 _charToBits[i] = -1;
\r
21 for (int i = 0; i < BASE64_CHARS.length(); i++)
\r
22 _charToBits[BASE64_CHARS.charAt(i)] = (byte) i;
\r
23 _charToBits[PAD_CHAR] = 0;
\r
28 * Decode the specified Base64 string and write binary data
\r
29 * to the given stream.
\r
30 * @param str Base64 encoded string
\r
31 * @param w output stream
\r
33 public static String decodeData(String str) throws IOException
\r
38 if (str == null || str.length() < 1)
\r
41 r = new StringReader(str);
\r
43 StringWriter w = new StringWriter();
\r
45 // spin through the input string
\r
46 c1 = readToNonSpace(r);
\r
55 c2 = readToNonSpace(r);
\r
56 c3 = readToNonSpace(r);
\r
57 c4 = readToNonSpace(r);
\r
59 throw new IllegalArgumentException("Encoded string ends prematurely.");
\r
61 p1 = charToBits(c1);
\r
62 p2 = charToBits(c2);
\r
70 p3 = charToBits(c3);
\r
78 p4 = charToBits(c4);
\r
80 if (p1 < 0 || p2 < 0 || p3 < 0 || p4 < 0)
\r
81 throw new IllegalArgumentException("Encoded string contains invalid characters.");
\r
83 n = (p1 << 18) | (p2 << 12) | (p3 << 6) | p4;
\r
85 w.write((byte) ((n & 0xFF0000) >> 16));
\r
87 w.write((byte) ((n & 0x00FF00) >> 8));
\r
89 w.write((byte) (n & 0x0000FF));
\r
91 c1 = readToNonSpace(r);
\r
92 if (c1 > 0 && pad > 0)
\r
93 throw new IllegalArgumentException("Extra characters found after padding.");
\r
96 return w.toString();
\r
100 private static int readToNonSpace(Reader r)
\r
106 while (c >= 0 && Character.isWhitespace(c))
\r
112 private static int charToBits(int c)
\r
114 // use it to look up the value
\r
115 if (c < 0 || c >= _charToBits.length)
\r
118 return _charToBits[c];
\r