Index: seasar2/s2-framework/src/test/java/org/seasar/framework/util/Base64UtilTest.java =================================================================== --- seasar2/s2-framework/src/test/java/org/seasar/framework/util/Base64UtilTest.java (revision 1245) +++ seasar2/s2-framework/src/test/java/org/seasar/framework/util/Base64UtilTest.java (working copy) @@ -26,6 +26,8 @@ private static final String ENCODED_DATA = "aG93IG5vdyBicm93biBjb3cNCg=="; + private static final String ENCODED_DATA_WITH_NON_BASE64 = "}a#G93I@G5v$dyBicm93biBjb3cNCg=#="; + private static final String ORIGINAL2 = "abc"; private static final byte[] BINARY_DATA2 = ORIGINAL2.getBytes(); @@ -52,7 +54,6 @@ assertEquals("2", ENCODED_DATA2, Base64Util.encode(BINARY_DATA2)); assertEquals("3", ENCODED_DATA3, Base64Util.encode(BINARY_DATA3)); assertEquals("4", ENCODED_DATA4, Base64Util.encode(BINARY_DATA4)); - System.out.println(Base64Util.encode(new byte[] { 'a', 'b', 'c' })); } public void testDecode() throws Exception { @@ -68,4 +69,12 @@ assertEquals("5", ORIGINAL4, new String(Base64Util .decode(ENCODED_DATA4))); } + + public void testDecodeWithBase64() throws Exception { + byte[] decodedData = Base64Util.decode(ENCODED_DATA_WITH_NON_BASE64); + assertEquals("1", BINARY_DATA.length, decodedData.length); + for (int i = 0; i < decodedData.length; i++) { + assertEquals("2", BINARY_DATA[i], decodedData[i]); + } + } } Index: seasar2/s2-framework/src/main/java/org/seasar/framework/util/Base64Util.java =================================================================== --- seasar2/s2-framework/src/main/java/org/seasar/framework/util/Base64Util.java (revision 1245) +++ seasar2/s2-framework/src/main/java/org/seasar/framework/util/Base64Util.java (working copy) @@ -62,7 +62,8 @@ return new String(outData); } - public static byte[] decode(final String inData) { + public static byte[] decode(String inData) { + inData = discardNonBase64(inData); int num = (inData.length() / 4) - 1; int lastBytes = getLastBytes(inData); byte[] outData = new byte[num * 3 + lastBytes]; @@ -144,6 +145,31 @@ outData[outIndex + 1] = (byte) (b1 << 4 & 0xf0 | b2 >> 2 & 0xf); } + private static String discardNonBase64(String inData) { + byte[] data = inData.getBytes(); + int num = data.length; + int bytesCopied = 0; + byte[] base64Data = new byte[num]; + for (int i = 0; i < num; i++) { + if (isBase64(data[i])) { + base64Data[bytesCopied++] = data[i]; + } + } + byte packedData[] = new byte[bytesCopied]; + System.arraycopy(base64Data, 0, packedData, 0, bytesCopied); + return new String(packedData); + } + + private static boolean isBase64(byte octect) { + if (octect == PAD) { + return true; + } else if (octect < 0 || DECODE_TABLE[octect] == Byte.MAX_VALUE) { + return false; + } else { + return true; + } + } + private static int getLastBytes(final String inData) { int len = inData.length(); if (inData.charAt(len - 2) == PAD) {