web-dev-qa-db-ja.com

JDK6のみを使用したBase64デコード

JDK 5に関するこの質問 によると、JDK 5で提供される実装はありませんが、JDK 6にはSun.misc.Base64Decoder

私の知る限りでは、このクラスはJDKに付属しておらず、他の同様のクラスを見つけることができませんでした。

では、JDK6の状況はどうですか?

私はCommonsやJBossの実装のような多数の実装を知っていますが、制限付きのサードパーティlibポリシーを持っているので、ホイールの再発明を回避しようとしています。

24
kostja

いいえ、状況はJava 5とJava 6.の間で変わりませんでした。

残念ながら、Java SEプラットフォームには、公式のBase64実装はありません。 @bestsssは、isが実際にJava SE 6(詳細については彼の答え)。

Sun JDKにはこのクラス(Sun.misc.Base64Decoder)ですが、指定されておらず、 は使用しないでください (特に、他の実装やバージョンに存在する必要がないため)。

サードパーティのライブラリを絶対に避ける必要がある場合( Apache Commons CodecBase64実装の伝統的なプロバイダーです )、それからあなたはBSD(または同様の)ライセンスバージョンをプロジェクトにコピーする場合があります。 パブリックドメインの実装 があり、ライセンスに関しては、それはそれが得るのと同じくらい簡単です。

10
Joachim Sauer

Javaには公式の(_Sun.misc_以外の)実装がありますが、誰もが想定している場所ではありません。

_Java.util.prefs.AbstractPreferences_は、そうするために必要なメソッドを持つものです。 putメソッドをオーバーライドする必要があります。

もう1つは、はるかに使いやすくなっています。

_javax.xml.bind.DatatypeConverter_ 対象となる2つのメソッドがあります。


abstractPreferencesのbase64の性質を明確化:Java.util.prefs.Preferences

 /**
 *指定されたバイト配列を表す文字列を、この設定ノードの
 *指定されたキーに関連付けます。関連する文字列は
 *です Base64 RFC 2045のセクション6.8で定義されているバイト配列のエンコード、
 * 1つのマイナーな変更:文字列は文字のみで構成されます
 * Base64アルファベット;改行
 *文字は含まれません。バイト配列の最大長は[____。] * MAX_VALUE_LENGTHの4分の3に制限されているため、Base64エンコードされた文字列の長さ
 *はMAX_VALUE_LENGTH。
を超えないことに注意してください。*このメソッド
 * {@link #getByteArray}。
 */
と組み合わせて使用​​するためのものです。public abstract void putByteArray(String key、byte [] value); 
55
bestsss

Joachim Sauerが以前のコメントで言ったように、JDK1.6はすでにそれ自体のBase64実装(Sun.misc。*)にバンドルされています。以下に例を示します。

String toEncode = "Encoding and Decoding in Base64 Test";
//Encoding in b64
String encoded = new BASE64Encoder().encode(toEncode.getBytes());
System.out.println(encoded);
//Decoding in b64
byte[] decodeResult = new BASE64Decoder().decodeBuffer(encoded);
System.out.println(new String(decodeResult));
7
Marco

私はbyte[] decodedValue = DatatypeConverter.parseBase64Binary(value);を使用しました

このウェブサイトはよく説明しています: https://www.rgagnon.com/javadetails/Java-0598.html

それからの抜粋:

   public static String encode(String value) throws Exception {
      return  DatatypeConverter.printBase64Binary
          (value.getBytes(StandardCharsets.UTF_8)); // use "utf-8" if Java 6
   }

   public static String decode(String value) throws Exception {
      byte[] decodedValue = DatatypeConverter.parseBase64Binary(value);
      return new String(decodedValue, StandardCharsets.UTF_8); // use "utf-8" if Java 6
   }
4
Shimon Doodkin