[java] Java에서 Base64로 인코딩

Java로 Base64 인코딩으로 일부 데이터를 인코딩해야합니다. 어떻게합니까? Base64 인코더를 제공하는 클래스의 이름은 무엇입니까?


나는 sun.misc.BASE64Encoder성공하지 않고 수업 을 사용하려고했습니다 . Java 7 코드의 다음 줄이 있습니다.

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

Eclipse를 사용하고 있습니다. Eclipse는이 행을 오류로 표시합니다. 필요한 라이브러리를 가져 왔습니다.

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

그러나 두 가지 모두 오류로 표시됩니다. 나는 비슷한 게시물을 여기 에서 발견 했다 .

다음을 포함하여 제안 된 솔루션으로 Apache Commons를 사용했습니다.

import org.apache.commons.*;

http://commons.apache.org/codec/ 에서 다운로드 한 JAR 파일 가져 오기

그러나 문제는 여전히 존재합니다. Eclipse는 여전히 앞서 언급 한 오류를 보여줍니다. 어떻게해야합니까?



답변

수업 가져 오기를 변경해야합니다.

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.util.Base64Java 8과 함께 사용할 수 있습니다. 먼저 평소와 같이 가져옵니다.

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 설명서를 참조하십시오 .


답변

Java 8의 절대 재미가없는 클래스를 사용하십시오. java.util.Base64

new String(Base64.getEncoder().encode(bytes));


답변

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


답변

Base64 인코딩을 사용하여 변환 할 수도 있습니다. 이렇게하려면이 javax.xml.bind.DatatypeConverter#printBase64Binary방법을 사용할 수 있습니다 .

예를 들면 다음과 같습니다.

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


답변

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


답변

Eclipse는 JDK 공급 업체에 고유하고 공개 API의 일부가 아닌 내부 클래스를 사용하려고하기 때문에 오류 / 경고를 표시합니다. Jakarta Commons는 물론 다른 패키지에있는 base64 코덱의 자체 구현을 제공합니다. 해당 가져 오기를 삭제하고 Eclipse가 적절한 Commons 클래스를 가져 오도록하십시오.


답변

이것을 변환하려면 Java의 오픈 소스 Base64 인코더 / 디코더 인 Base64Coder 에서 얻을 수있는 인코더 및 디코더가 필요합니다 . 필요한 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 <= 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에서는 서버 나 웹 서비스에 업로드하기 위해 비트 맵을 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 페이지로 직접 재생하기 위해 이것을 사용할 수 있습니다 ( reference ).

<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