Base64エンコードされた画像があります。これをJavaでデコードするには、どのような方法がありますか?できればSun Java 6に含まれるライブラリだけを使ってほしいですね。
Sun は Java と一緒に base64 エンコーダーを出荷しているので、commons を使う必要はありません。 それをそのままインポートすることができます。
import sun.misc.BASE64Decoder;
そして、次のように使用します。
BASE64Decoder decoder = new BASE64Decoder();
byte[] decodedBytes = decoder.decodeBuffer(encodedBytes);
ここで、encodedBytes
は、java.lang.String
またはjava.io.InputStream
のいずれかです。 sun.*`のクラスはSunが公式にサポートしているわけではありませんので、ご注意ください。
EDIT:これが私が投稿した中で最も議論を呼ぶ回答になるとは誰が予想したでしょうか? 確かにsun.*のパッケージはサポートされていないし、存在し続けることも保証されていませんし、Commonsのことも知っていますし、いつも使っています。 しかし、投稿者はSun Java 6に付属しているクラスを求めており、私はそれに答えようとしたのです。 一般的にコモンズが一番良い方法であることには同意します。
EDIT 2: amir75さんが以下で指摘しているように、Java 6+にはJAXBが同梱されており、Base64のエンコード/デコードをサポートするコードが含まれています。以下のJeremy Ross' answerを参照してください。
具体的には、Commons Codec:Base64`クラスを、decode(byte[] array)
またはencode(byte[] array)
に変換します。
sun.misc.BASE64Decoderやコアではないライブラリの代わりに、
javax.mail.internet.MimeUtility.decode()`を使ってみてください。
public static byte[] encode(byte[] b) throws Exception {
ByteArrayOutputStream baos = new ByteArrayOutputStream();
OutputStream b64os = MimeUtility.encode(baos, "base64");
b64os.write(b);
b64os.close();
return baos.toByteArray();
}
public static byte[] decode(byte[] b) throws Exception {
ByteArrayInputStream bais = new ByteArrayInputStream(b);
InputStream b64is = MimeUtility.decode(bais, "base64");
byte[] tmp = new byte[b.length];
int n = b64is.read(tmp);
byte[] res = new byte[n];
System.arraycopy(tmp, 0, res, 0, n);
return res;
}
フルコードのリンクです。Base64から/へのエンコード/デコード.