web-dev-qa-db-ja.com

JavaでのBase64エンコーディング

私はEclipseを使っています。次のようなコードがあります。

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

Eclipseはこの行をエラーとしてマークします。必要なライブラリをインポートしました。

import Sun.misc.BASE64Encoder;
import Sun.misc.BASE64Decoder;

しかし、やはり、両方ともエラーとして表示されます。 こちらの類似記事 .

私が提案した解決策としてApache Commonsを使用しました。

import org.Apache.commons.*;

からダウンロードしたJARファイルのインポートとインポート: http://commons.Apache.org/codec/ /

しかし、問題はまだ存在します。 Eclipseはまだ前述のエラーを示しています。お知らせ下さい。

277
Jury A

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

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

次に、Classを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を使うべきでないのですか?* packages


アップデート(16/12/2016)

あなたは今Java8で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用のJavadocを参照してください。 https://docs.Oracle.com/javase/8/docs/api/Java/util/Base64.html

560
Frank

Java 8の決して遅すぎずに参加するクラスを使用してください: Java.util.Base64

209
bratan

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

例えば:

byte[] salt = new byte[] { 50, 111, 8, 53, 86, 35, -19, -47 };
System.out.println(DatatypeConverter.printBase64Binary(salt));
64
stinepike

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==
60
Kirby

Google Guava はbase64データのエンコードとデコードに適しています。

POM設定:

<dependency>
   <artifactId>guava</artifactId>
   <groupId>com.google.guava</groupId>
   <type>jar</type>
   <version>14.0.1</version>
</dependency>

サンプルコード:

String inputContent = "Hello Việt Nam";
String base64String = BaseEncoding.base64().encode(inputContent.getBytes("UTF-8"));
//decode
System.out.println("Base64:" + base64String);//SGVsbG8gVmnhu4d0IE5hbQ==
byte[] contentInBytes = BaseEncoding.base64().decode(base64String);
System.out.println("Source content: " + new String(contentInBytes, "UTF-8"));//Hello Việt Nam
18
Tho

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

9
Marko Topolnik

Java 6-7の場合、最良の選択肢はAndroidリポジトリからコードを借りることです。依存関係はありません。

https://github.com/Android/platform_frameworks_base/blob/master/core/Java/Android/util/Base64.Java

8
Alexey Zakharov

Androidでは、 Android.util.Base64 ユーティリティクラスの静的メソッドを使用します。参照されているドキュメントには、Base64クラスがAPIレベル8(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));
7
Yojimbo

これを変換するためには、あなたは http://www.source-code.biz/base64coder/Java/ から得られるエンコーダとデコーダが必要です。 File Base64Coder.Java 必要です。

今すぐあなたの要件に従ってこのクラスにアクセスするには、以下のクラスが必要になります。

import Java.io.BufferedInputStream;
import Java.io.BufferedOutputStream;
import Java.io.BufferedReader;
import Java.io.BufferedWriter;
import Java.io.File;
import Java.io.FileInputStream;
import Java.io.FileOutputStream;
import Java.io.FileReader;
import Java.io.FileWriter;
import Java.io.InputStream;
import Java.io.IOException;
import Java.io.OutputStream;

public class Base64 {

 public static void main(String args[]) throws IOException {
  /*
   * if (args.length != 2) {System.out.println(
   * "Command line parameters: inputFileName outputFileName");
   * System.exit(9); } encodeFile(args[0], args[1]);
   */
  File sourceImage = new File("back3.png");
  File sourceImage64 = new File("back3.txt");
  File destImage = new File("back4.png");
  encodeFile(sourceImage, sourceImage64);
  decodeFile(sourceImage64, destImage);
 }

 private static void encodeFile(File inputFile, File outputFile) throws IOException {
  BufferedInputStream in = null;
  BufferedWriter out = null;
  try {
   in = new BufferedInputStream(new FileInputStream(inputFile));
   out = new BufferedWriter(new FileWriter(outputFile));
   encodeStream(in, out);
   out.flush();
  } finally {
   if (in != null)
    in.close();
   if (out != null)
    out.close();
  }
 }

 private static void encodeStream(InputStream in, BufferedWriter out) throws IOException {
  int lineLength = 72;
  byte[] buf = new byte[lineLength / 4 * 3];
  while (true) {
   int len = in.read(buf);
   if (len &lt;= 0)
    break;
   out.write(Base64Coder.encode(buf, 0, len));
   out.newLine();
  }
 }

 static String encodeArray(byte[] in) throws IOException {
  StringBuffer out = new StringBuffer();
  out.append(Base64Coder.encode(in, 0, in.length));
  return out.toString();
 }

 static byte[] decodeArray(String in) throws IOException {
  byte[] buf = Base64Coder.decodeLines(in);
  return buf;
 }

 private static void decodeFile(File inputFile, File outputFile) throws IOException {
  BufferedReader in = null;
  BufferedOutputStream out = null;
  try {
   in = new BufferedReader(new FileReader(inputFile));
   out = new BufferedOutputStream(new FileOutputStream(outputFile));
   decodeStream(in, out);
   out.flush();
  } finally {
   if (in != null)
    in.close();
   if (out != null)
    out.close();
  }
 }

 private static void decodeStream(BufferedReader in, OutputStream out) throws IOException {
  while (true) {
   String s = in.readLine();
   if (s == null)
    break;
   byte[] buf = Base64Coder.decodeLines(s);
   out.write(buf);
  }
 }
}

Androidでは、サーバー/ Webサービスにアップロードするために、ビットマップをBase64に変換できます。

Bitmap bmImage = //Data
ByteArrayOutputStream baos = new ByteArrayOutputStream();
bmImage.compress(Bitmap.CompressFormat.JPEG, 100, baos);
byte[] imageData = baos.toByteArray();
String encodedImage = Base64.encodeArray(imageData);

この「encodedImage」はあなたの画像のテキスト表現です。以下のようにアップロード目的またはHTMLページに直接コピーする目的でこれを使用することができます( 参照 ):

<img alt="" src="data:image/png;base64,<?php echo $encodedImage; ?>" width="100px" />
<img alt="" src="data:image/png;base64,/9j/4AAQ...........1f/9k=" width="100px" />

ドキュメント: http://dwij.co.in/Java-base64-image-encoder

ここに私の2セントがあります... Java 8はBase64のそれ自身の実装を含んでいます。しかし、ちょっと気になるところがあります。説明のために、コード例を示します。

私のコーデックラッパー:

public interface MyCodec
{
  static String apacheDecode(String encodedStr)
  {
     return new String(Base64.decodeBase64(encodedStr), Charset.forName("UTF-8"));
  }

  static String apacheEncode(String decodedStr)
  {
      byte[] decodedByteArr = decodedStr.getBytes(Charset.forName("UTF-8"));
      return Base64.encodeBase64String(decodedByteArr);
  }

  static String javaDecode(String encodedStr)
  {
      return new String(Java.util.Base64.getDecoder().decode(encodedStr), Charset.forName("UTF-8"));
  }

  static String javaEncode(String decodedStr)
  {
    byte[] decodedByteArr = decodedStr.getBytes(Charset.forName("UTF-8"));
    return Java.util.Base64.getEncoder().encodeToString(decodedByteArr);
  }
}

テストクラス:

public class CodecDemo
{
  public static void main(String[] args)
  {
    String decodedText = "Hello World!";

    String encodedApacheText = MyCodec.apacheEncode(decodedText);
    String encodedJavaText = MyCodec.javaEncode(decodedText);

    System.out.println("Apache encoded text: " + MyCodec.apacheEncode(encodedApacheText));
    System.out.println("Java encoded text: " + MyCodec.javaEncode(encodedJavaText));

    System.out.println("Encoded results equal: " + encodedApacheText.equals(encodedJavaText));

    System.out.println("Apache decode Java: " + MyCodec.apacheDecode(encodedJavaText));
    System.out.println("Java decode Java: " + MyCodec.javaDecode(encodedJavaText));

    System.out.println("Apache decode Apache: " + MyCodec.apacheDecode(encodedApacheText));
    System.out.println("Java decode Apache: " + MyCodec.javaDecode(encodedApacheText));
  }
}

出力:

Apache encoded text: U0dWc2JHOGdWMjl5YkdRaA0K

Java encoded text: U0dWc2JHOGdWMjl5YkdRaA==
Encoded results equal: false
Apache decode Java: Hello World!
Java decode Java: Hello World!
Apache decode Apache: Hello World!
Exception in thread "main" Java.lang.IllegalArgumentException: Illegal base64 character d
    at Java.util.Base64$Decoder.decode0(Base64.Java:714)
    at Java.util.Base64$Decoder.decode(Base64.Java:526)
    at Java.util.Base64$Decoder.decode(Base64.Java:549)

Apacheでエンコードされたテキストでは、最後に改行(空白)が追加されています。したがって、Base64の実装に関係なく、コーデックで同じ結果が得られるようにするには、Apacheエンコードテキストでtrim()を呼び出す必要がありました。私の場合は、前述のメソッド呼び出しをコーデックのapacheDecode()に次のように追加しました。

return Base64.encodeBase64String(decodedByteArr).trim();

この変更が行われたら、結果は私が最初に期待するものです。

Apache encoded text: U0dWc2JHOGdWMjl5YkdRaA==
Java encoded text: U0dWc2JHOGdWMjl5YkdRaA==
Encoded results equal: true
Apache decode Java: Hello World!
Java decode Java: Hello World!
Apache decode Apache: Hello World!
Java decode Apache: Hello World!

多分誰かがこれがなぜであるかについてコメントすることができました、しかし私は私の回避策を許容できる妥協案として見つけました。

7
hfontanez

Apache commonsはbase64のNice実装をしています。あなたはこれと同じくらい簡単にこれを行うことができます

// 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));

base64エンコードの詳細については、 http://faisalbhagat.blogspot.com/2014/06/base64-encoding-using-Java-and.html を参照してください。

5
faisalbhagat

もしあなたがSpringフレームワークの少なくともバージョン4.1を使っているなら、 org.springframework.util.Base64Utils classを使うことができます。

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

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

3
holmis83

Java 8の簡単な例:

import Java.util.Base64;

String str = "your string";
String encodedStr = Base64.getEncoder().encodeToString(str.getBytes("utf-8"));
3
z3d0

8より前のバージョンのJavaに固執していて、すでに AWS SDK for Java を使用している場合は、 com.amazonaws.util.Base64 を使用できます。

2
auselen

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

import javax.xml.bind.DatatypeConverter;

public static String toBase64(String data) {
    return DatatypeConverter.printBase64Binary(data.getBytes());
}
1
Daniel De León

私は次のコードスニペットを試してみました。それはうまくいった。 :-)

com.Sun.org.Apache.xml.internal.security.utils.Base64.encode("The string to encode goes here");
0
tmh