Java에서 Base64로 인코딩
자바에서 Base64 인코딩으로 데이터를 인코딩해야 합니다.그걸 어떻게 하는 거죠?Base64 인코더를 제공하는 클래스의 이름은 무엇입니까?
는 ★★★★★★★★★★★★★★★★★★★★★★를 사용해 보았다.sun.misc.BASE64Encoder
업,, 성성성성 다성다다Java 7 드음 음음 음음 음 java 음 java java java java java
wr.write(new sun.misc.BASE64Encoder().encode(buf));
이클립스를 쓰고 있어요이클립스는 이 선을 오류로 표시합니다.필요한 라이브러리를 Import했습니다.
import sun.misc.BASE64Encoder;
import sun.misc.BASE64Decoder;
그러나 두 가지 모두 오류로 표시됩니다.여기서 비슷한 글을 찾았어요.
Apache Commons를 사용하여 다음을 포함한 솔루션을 제안했습니다.
import org.apache.commons.*;
http://commons.apache.org/codec/ 에서 다운로드한 JAR 파일을 Import 합니다.
하지만 문제는 여전히 존재한다.Eclipse에서는 앞서 언급한 오류가 여전히 표시됩니다.어떻게 해야 하나?
클래스의 Import를 변경해야 합니다.
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));
그렇다면 왜 태양을 사용하지 말아야 하는지 읽어보세요.* 패키지
갱신(2016-12-16)
해서 '어울리지 않다'를 할 수 되었습니다.java.util.Base64
Java 8 java java java java java java java java java java수입하다
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의 Never-too-to-join-to-the-fun 클래스 사용:
new String(Base64.getEncoder().encode(bytes));
8과 같이 할 수 있습니다.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 인코딩을 사용하여 변환할 수도 있습니다.이를 위해 이 방법을 사용할 수 있습니다.
예를 들어 다음과 같습니다.
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는 공개 API의 일부가 아닌 JDK 공급업체에 고유한 내부 클래스를 사용하려고 하므로 오류/경고를 표시합니다.자카르타 커먼스는 base64 코덱을 자체 실장하고 있습니다.물론 다른 패키지에 포함되어 있습니다.가져오기를 삭제하고 Eclipse가 적절한 Commons 클래스를 가져오도록 하십시오.
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에 콜해야 .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!
결론: Apache Base64에서 Java로 전환하려면 다음 작업을 수행해야 합니다.
- Apache 디코더로 인코딩된 텍스트를 디코딩합니다.
- Java를 사용하여 결과(일반) 텍스트를 인코딩합니다.
이러한 순서를 따르지 않고 전환하면, 대부분의 경우 문제가 발생합니다.그렇게 해서 이 발견을 하게 되었습니다.
Java 6-7의 경우 Android 저장소에서 코드를 빌리는 것이 가장 좋습니다.종속성이 없습니다.
https://github.com/android/platform_frameworks_base/blob/master/core/java/android/util/Base64.java
이것을 변환하려면 , Base64Coder(Java 의 오픈 소스 Base64 인코더/디코더)로부터 입수할 수 있는코더와 디코더가 필요합니다.필요한 것은 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);
이 "encoded Image"는 이미지를 텍스트로 표현한 것입니다.다음과 같이 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
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));
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 인코딩에 대한 자세한 내용을 확인할 수 있습니다.
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 Datype Converter에 위임됩니다.
Java 8의 간단한 예:
import java.util.Base64;
String str = "your string";
String encodedStr = Base64.getEncoder().encodeToString(str.getBytes("utf-8"));
Java 7에서는 이 방법을 코드화했습니다.
import javax.xml.bind.DatatypeConverter;
public static String toBase64(String data) {
return DatatypeConverter.printBase64Binary(data.getBytes());
}
8보다 이전 버전의 Java를 사용하고 있지만 이미 Java용 AWS SDK를 사용하고 있다면 com.amazonaws.util을 사용할 수 있습니다.베이스 64
아래의 코드 스니펫으로 시도했습니다.잘 작동했습니다. :-)
com.sun.org.apache.xml.internal.security.utils.Base64.encode("The string to encode goes here");
public String convertImageToBase64(String filePath) {
byte[] fileContent = new byte[0];
String base64encoded = null;
try {
fileContent = FileUtils.readFileToByteArray(new File(filePath));
} catch (IOException e) {
log.error("Error reading file: {}", filePath);
}
try {
base64encoded = Base64.getEncoder().encodeToString(fileContent);
} catch (Exception e) {
log.error("Error encoding the image to base64", e);
}
return base64encoded;
}
이 라이브러리를 앱 수준 종속성에 추가
실장 'syslog.syslog:syslog-collections4:4.4'
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의 JAR 파일을 가져오는 방법BASE64인코더 클래스?
언급URL : https://stackoverflow.com/questions/13109588/encoding-as-base64-in-java
'source' 카테고리의 다른 글
Windows OS용 OpenJDK 가용성 (0) | 2022.08.16 |
---|---|
스위치에서 null을 사용하는 방법 (0) | 2022.08.16 |
값(vuej)을 전달하시겠습니까? (0) | 2022.08.16 |
Java 8: 여러 단위의 2개의 LocalDateTime 차이 (0) | 2022.08.16 |
Vuex가 정의되지 않은 속성을 읽을 수 없음 (0) | 2022.08.16 |