361

Java の Base64 エンコーディングで一部のデータをエンコードする必要があります。それ、どうやったら出来るの?Base64 エンコーダーを提供するクラスの名前は?


sun.misc.BASE64Encoderクラスを使用しようとしましたが、成功しませんでした。次の Java 7 コード行があります。

wr.write(new sun.misc.BASE64Encoder().encode(buf));

私はエクリプスを使用しています。Eclipse はこの行をエラーとしてマークします。必要なライブラリをインポートしました:

import sun.misc.BASE64Encoder;
import sun.misc.BASE64Decoder;

ただし、どちらもエラーとして表示されます。ここで同様の投稿を見つけました。

以下を含めることで提案されたソリューションとして、Apache Commons を使用しました。

import org.apache.commons.*;

http://commons.apache.org/codec/からダウンロードした JAR ファイルをインポートします。

しかし、問題はまだ存在します。Eclipse では、前述のエラーが引き続き表示されます。私は何をすべきか?

4

19 に答える 19

692

クラスのインポートを変更する必要があります。

import org.apache.commons.codec.binary.Base64;

次に、Base64 クラスを使用するようにクラスを変更します。

コード例を次に示します。

byte[] encodedBytes = Base64.encodeBase64("Test".getBytes());
System.out.println("encodedBytes " + new String(encodedBytes));
byte[] decodedBytes = Base64.decodeBase64(encodedBytes);
System.out.println("decodedBytes " + new String(decodedBytes));

次に、sun.* パッケージを使用すべきではない理由をお読みください。


更新 (2016-12-16)

Java 8 で使用できるようjava.util.Base64になりました。まず、通常どおりインポートします。

import java.util.Base64;

次に、Base64 静的メソッドを次のように使用します。

byte[] encodedBytes = Base64.getEncoder().encode("Test".getBytes());
System.out.println("encodedBytes " + new String(encodedBytes));
byte[] decodedBytes = Base64.getDecoder().decode(encodedBytes);
System.out.println("decodedBytes " + new String(decodedBytes));

文字列を直接エンコードし、エンコードされた文字列として結果を取得する場合は、これを使用できます。

String encodeBytes = Base64.getEncoder().encodeToString((userName + ":" + password).getBytes());

詳細については、Base64 の Java ドキュメントを参照してください。

于 2012-10-28T14:25:15.023 に答える
83

Java 8 では、次のように実行できます。 Base64.getEncoder().encodeToString(string.getBytes(StandardCharsets.UTF_8))

自己完結型の短い完全な例を次に示します。

import java.nio.charset.StandardCharsets;
import java.util.Base64;

public class Temp {
    public static void main(String... args) throws Exception {
        final String s = "old crow medicine show";
        final byte[] authBytes = s.getBytes(StandardCharsets.UTF_8);
        final String encoded = Base64.getEncoder().encodeToString(authBytes);
        System.out.println(s + " => " + encoded);
    }
}

出力:

old crow medicine show => b2xkIGNyb3cgbWVkaWNpbmUgc2hvdw==
于 2014-11-12T22:16:13.103 に答える
67

Base64 エンコーディングを使用して変換することもできます。これを行うには、javax.xml.bind.DatatypeConverter#printBase64Binaryメソッドを使用できます。

例えば:

byte[] salt = new byte[] { 50, 111, 8, 53, 86, 35, -19, -47 };
System.out.println(DatatypeConverter.printBase64Binary(salt));
于 2013-05-31T10:00:11.713 に答える
11

パブリック API の一部ではなく、JDK ベンダーに固有の内部クラスを使用しようとしているため、Eclipse はエラー/警告を出します。Jakarta Commons は、base64 コーデックの独自の実装を提供します。もちろん、これらは別のパッケージに含まれています。これらのインポートを削除して、Eclipse に適切な Commons クラスをインポートさせます。

于 2012-10-28T14:26:27.020 に答える
10

Java 6 ~ 7 の場合、最適なオプションは Android リポジトリからコードを借用することです。依存関係はありません。

https://github.com/android/platform_frameworks_base/blob/master/core/java/android/util/Base64.java

于 2015-06-13T00:24:45.543 に答える
8

Android では、android.util.Base64ユーティリティ クラスの静的メソッドを使用します。参照ドキュメントによると、Base64 クラスは API レベル 8 ( Android 2.2 (Froyo)) で追加されました。

import android.util.Base64;

byte[] encodedBytes = Base64.encode("Test".getBytes());
Log.d("tag", "encodedBytes " + new String(encodedBytes));

byte[] decodedBytes = Base64.decode(encodedBytes);
Log.d("tag", "decodedBytes " + new String(decodedBytes));
于 2016-08-23T17:02:13.880 に答える
7

Spring Frameworkバージョン 4.1 以降を使用している場合は、org.springframework.util.Base64Utils クラスを使用できます

byte[] raw = { 1, 2, 3 };
String encoded = Base64Utils.encodeToString(raw);
byte[] decoded = Base64Utils.decodeFromString(encoded);

利用可能なものに応じて、Java 8 の Base64、Apache Commons Codec、または JAXB DatatypeConverter に委譲します。

于 2016-08-19T12:23:30.697 に答える
7

Apache Commonsには Base64 の優れた実装があります。これは次のように簡単に実行できます。

// Encrypt data on your side using BASE64
byte[] bytesEncoded = Base64.encodeBase64(str .getBytes());
System.out.println("ecncoded value is " + new String(bytesEncoded));

// Decrypt data on other side, by processing encoded data
byte[] valueDecoded= Base64.decodeBase64(bytesEncoded );
System.out.println("Decoded value is " + new String(valueDecoded));

Java および JavaScript を使用した Base64 エンコーディングで、base64 エンコーディングの詳細を確認できます。

于 2014-06-06T11:15:03.493 に答える
5

Java 8 の簡単な例:

import java.util.Base64;

String str = "your string";
String encodedStr = Base64.getEncoder().encodeToString(str.getBytes("utf-8"));
于 2015-11-15T20:27:40.177 に答える
3

Java 7では、このメソッドをコーディングしました

import javax.xml.bind.DatatypeConverter;

public static String toBase64(String data) {
    return DatatypeConverter.printBase64Binary(data.getBytes());
}
于 2016-03-14T17:48:56.627 に答える
1

次のコードスニペットで試しました。うまくいきました。:-)

com.sun.org.apache.xml.internal.security.utils.Base64.encode("The string to encode goes here");
于 2015-03-04T12:27:09.077 に答える
-1

GZIP + Base64

Base64フォーマット内の文字列の長さは、133%平均して元の文字列よりも長くなります。GZIPしたがって、最初に で圧縮してから にエンコードするのが理にかなっていBase64ます。77%200 文字以上の文字列の場合、最大 まで削減できます。例:

public static void main(String[] args) throws IOException {
    byte[] original = randomString(100).getBytes(StandardCharsets.UTF_8);

    byte[] base64 = encodeToBase64(original);
    byte[] gzipToBase64 = encodeToBase64(encodeToGZIP(original));

    byte[] fromBase64 = decodeFromBase64(base64);
    byte[] fromBase64Gzip = decodeFromGZIP(decodeFromBase64(gzipToBase64));

    // test
    System.out.println("Original: " + original.length + " bytes, 100%");
    System.out.println("Base64: " + base64.length + " bytes, "
            + (base64.length * 100 / original.length) + "%");
    System.out.println("GZIP+Base64: " + gzipToBase64.length + " bytes, "
            + (gzipToBase64.length * 100 / original.length) + "%");

    //Original: 3700 bytes, 100%
    //Base64: 4936 bytes, 133%
    //GZIP+Base64: 2868 bytes, 77%

    System.out.println(Arrays.equals(original, fromBase64)); // true
    System.out.println(Arrays.equals(original, fromBase64Gzip)); // true
}
public static byte[] decodeFromBase64(byte[] arr) {
    return Base64.getDecoder().decode(arr);
}

public static byte[] encodeToBase64(byte[] arr) {
    return Base64.getEncoder().encode(arr);
}
public static byte[] decodeFromGZIP(byte[] arr) throws IOException {
    ByteArrayInputStream bais = new ByteArrayInputStream(arr);
    GZIPInputStream gzip = new GZIPInputStream(bais);
    return gzip.readAllBytes();
}

public static byte[] encodeToGZIP(byte[] arr) throws IOException {
    ByteArrayOutputStream baos = new ByteArrayOutputStream();
    GZIPOutputStream gzip = new GZIPOutputStream(baos);
    gzip.write(arr);
    gzip.finish();
    return baos.toByteArray();
}
public static String randomString(int count) {
    StringBuilder str = new StringBuilder();
    for (int i = 0; i < count; i++) {
        str.append(" ").append(UUID.randomUUID().toString());
    }
    return str.toString();
}

関連項目: sun.misc.BASE64Encoder クラスの JAR ファイルを取得するには?

于 2021-02-27T21:33:47.770 に答える