>  기사  >  Java  >  Java는 Base64 인코딩 및 디코딩을 어떻게 구현합니까? Base64 인코딩 및 디코딩의 4가지 방법 구현

Java는 Base64 인코딩 및 디코딩을 어떻게 구현합니까? Base64 인코딩 및 디코딩의 4가지 방법 구현

青灯夜游
青灯夜游앞으로
2018-10-25 16:56:174092검색

이 글의 내용은 Java에서 Base64 인코딩과 디코딩을 구현하는 방법을 소개하는 것입니다. Base64 인코딩 및 디코딩의 4가지 방법을 구현합니다. 도움이 필요한 친구들이 참고할 수 있기를 바랍니다.

Base64 인코딩을 사용하는 이유는 무엇인가요?

데이터는 ASCII를 사용하여 네트워크를 통해 전송됩니다. 일부 사진, 비디오 및 기타 데이터의 경우 ASCII의 보이지 않는 부분으로 인코딩될 수 있습니다. 네트워크의 다양한 라우팅 장치는 이를 다르게 처리하므로 데이터의 이 부분이 손실될 수 있습니다. 데이터 전송의 정확성을 보장하기 위해 Base64 인코딩을 사용하여 보이지 않는 데이터를 보이는 데이터로 인코딩할 수 있습니다.

Java에서 Base64 인코딩 및 디코딩을 구현하는 여러 가지 방법

방법 1

인코딩 및 디코딩을 위해 sun.misc 패키지의 BASE64Encoder 및 BASE64Decoder 클래스를 사용하세요. 이 방법은 비교적 오래되었으므로 권장되지 않습니다.

코드는 다음과 같습니다.

  /**
   * sun.misc方式Base64编码
   * @param str
   * @return
   */
  public static String encodeBySunMisc(String str) {    
     try {      
         return new BASE64Encoder().encode(str.getBytes("UTF-8"));
    } 
    catch (UnsupportedEncodingException e) {
      e.printStackTrace();      
      return "";
    }
  }  
  /**
   * sun.misc方式Base64解码
   * @param str
   * @return
   */
  public static String decodeBySunMisc(String str) {    
     try {      
         byte[] result = new BASE64Decoder().decodeBuffer(str);      
         return new String(result);
    } 
    catch (IOException e) {
      e.printStackTrace();     
      return "";
    }
  }

sun.misc의 Base64 도구는 jdk에 있지만 표준 라이브러리에 속하지 않으므로 Eclipse에서 직접 사용할 수 없습니다. 수동 소개를 통해 사용할 수 있습니다.

해결책:

프로젝트->속성->Java 빌드 경로->라이브러리를 마우스 오른쪽 버튼으로 클릭하고 외부 Jar 추가를 클릭한 다음 %JAVA_HOME%jrelibrt.jar을 선택합니다.

방법 2

Apache의 commons-code 패키지를 사용하세요. 이 방법은 sun.misc 방법보다 약간 빠릅니다.

코드는 다음과 같습니다

  /**
   * commons-code方式Base64编码
   * @param str
   * @return
   */
  public static String encodeByCommonsCode(String str) {    
      byte[] result;    
      try {
      result = org.apache.commons.codec.binary.Base64.encodeBase64(str.getBytes("UTF-8"));      
      return new String(result);
    } 
    catch (UnsupportedEncodingException e) {
      e.printStackTrace();      
      return "";
    }
  }  
  /**
   * commons-code方式Base64解码
   * @param str
   * @return
   */
  public static String decodeByCommonsCode(String str) {    
      byte[] result = org.apache.commons.codec.binary.Base64.decodeBase64(str.getBytes());    
      return new String(result);
  }

commons-code를 사용하려면 종속성을 도입해야 합니다. Gradle 프로젝트를 예로 들면, build.gradle에 다음 라인을 추가해야 합니다:

implementation 'commons-codec:commons-codec:1.11'

방법 3

Apache의 xerces 도구를 사용하세요. 이 도구는 주로 xml을 구문 분석하는 데 사용되며 Base64 인코딩 및 디코딩 기능을 가지고 있습니다.

코드는 다음과 같습니다.

  /**
   * xerces方式Base64解码
   * @param str
   * @return
   */
  public static String decodeByXerces(String str) {    
     try {      
         byte[] result = com.sun.org.apache.xerces.internal.impl.dv.util.Base64.decode(str);      
         return new String(result);
    } 
    catch (Exception e) {
      e.printStackTrace();      return "";
    }
  }  
  /**
   * Java8中的Base64编码
   * @param str
   * @return
   */
  public static String encodeByJava8(String str) {    
      try {      
         return Base64.getEncoder().encodeToString(str.getBytes("UTF-8"));
    } 
    catch (Exception e) {
      e.printStackTrace();      
      return "";
    }
  }

방법 4

Java8의 유틸리티 제품군에는 이미 Base64 인코딩 및 디코딩 도구가 포함되어 있으므로 이 방법을 사용하는 것이 매우 효율적입니다.

코드는 다음과 같습니다.

  /**
   * Java8中的Base64编码
   * @param str
   * @return
   */
  public static String encodeByJava8(String str) {    
      try {      
         return Base64.getEncoder().encodeToString(str.getBytes("UTF-8"));
    } 
    catch (Exception e) {
      e.printStackTrace();      
      return "";
    }
  }  
  /**
   * Java8中的Base64解码
   * @param str
   * @return
   */
  public static String decodeByJava8(String str) {    
       byte[] result = Base64.getDecoder().decode(str.getBytes());    
       return new String(result);
  }

여러 코딩 효과 테스트:

테스트 코드는 다음과 같습니다.

  private static void testEncodeAndDecode(String src) {
    String encedeStr1 = encodeBySunMisc(src);
    System.out.println("encode by sun misc: " + encedeStr1);
    
    String decedeStr1 = decodeBySunMisc(encedeStr1);
    System.out.println("decode by sun misc: " + decedeStr1);
    
    
    String encedeStr2 = encodeByCommonsCode(src);
    System.out.println("encode by commons-code: " + encedeStr2);
    
    String decedeStr2 = decodeByCommonsCode(encedeStr2);
    System.out.println("decode by commons-code: " + decedeStr2);

    
    String encedeStr3 = encodeByXerces(src);
    System.out.println("encode by xerces: " + encedeStr3);
    
    String decodeStr3 = decodeByXerces(encedeStr3);
    System.out.println("decode by xerces: " + decodeStr3);

    
    String encedeStr4 = encodeByJava8(src);
    System.out.println("encode by java8: " + encedeStr4);
    
    String decedeStr4 = decodeByJava8(encedeStr4);
    System.out.println("decode by java8: " + decedeStr4);
  }

테스트 결과는 다음과 같습니다.

encode by sun misc: YWJjZGVmZ2hpamtsbW5vcHFyc3Q7
decode by sun misc: abcdefghijklmnopqrst;
encode by commons-code: YWJjZGVmZ2hpamtsbW5vcHFyc3Q7
decode by commons-code: abcdefghijklmnopqrst;
encode by xerces: YWJjZGVmZ2hpamtsbW5vcHFyc3Q7
decode by xerces: abcdefghijklmnopqrst;
encode by java8: YWJjZGVmZ2hpamtsbW5vcHFyc3Q7
decode by java8: abcdefghijklmnopqrst;

여러 코덱의 효율성을 비교합니다. 각 인코딩 방법에 대해 20자 이상을 사용하여 먼저 인코딩한 다음 디코딩합니다. 총 실행 시간은 100만 번입니다.

테스트 코드는 다음과 같습니다.

  // 测试sun.misc编解码效率
  private static void testSunMisc(String src) {    
     long begin = System.currentTimeMillis();    
     for(int i = 0; i < 1000000; i++) {
      String encedeStr1 = encodeBySunMisc(src + i);
      decodeBySunMisc(encedeStr1);
    }    long finish = System.currentTimeMillis();
    System.out.println("sun misc consume: " + (finish - begin) + "ms");
  }  
  // 测试commons-code编解码效率
  private static void testCommonsCode(String src) {    
     long begin = System.currentTimeMillis();    
     for(int i = 0; i < 1000000; i++) {
      String encedeStr1 = encodeByCommonsCode(src + i);
      decodeByCommonsCode(encedeStr1);
    }    long finish = System.currentTimeMillis();
    System.out.println("commons-code consume: " + (finish - begin) + "ms");
  }  
  // 测试xerces编解码效率
  private static void testXerces(String src) {    
      long begin = System.currentTimeMillis();    
      for(int i = 0; i < 1000000; i++) {
      String encedeStr1 = encodeByXerces(src + i);
      decodeByXerces(encedeStr1);
    }    long finish = System.currentTimeMillis();
    System.out.println("xerces consume: " + (finish - begin) + "ms");
  }  
  // 测试Java8编解码效率
  private static void testJava8(String src) {    
     long begin = System.currentTimeMillis();    
     for(int i = 0; i < 1000000; i++) {
      String encedeStr1 = encodeByJava8(src + i);
      decodeByJava8(encedeStr1);
    }    
    long finish = System.currentTimeMillis();
    System.out.println("java 8 consume: " + (finish - begin) + "ms");
  }
  public static void main(String[] args) {
    String src = "abcdefghijklmnopqrst;";

    testSunMisc(src);
    testCommonsCode(src);
    testXerces(src);
    testJava8(src);
  }

총 3번 테스트한 결과 출력 결과는 다음과 같습니다.

commons-code consume: 3337ms
sun misc consume: 6532ms
xerces consume: 554ms
java 8 consume: 547ms

commons-code consume: 3148ms
sun misc consume: 6445ms
xerces consume: 498ms
java 8 consume: 466ms

commons-code consume: 3442ms
sun misc consume: 6674ms
xerces consume: 470ms
java 8 consume: 512ms

결론

고대 sun.misc 방법은 효율성이 가장 낮고 xerces 및 Java8 방법은 효율성이 가장 낮습니다. 가장 효율적입니다. Java8의 편리성으로 인해 인코딩 및 디코딩에는 Java8과 함께 제공되는 Base64 도구를 직접 사용하는 것이 좋습니다.

위 내용은 Java는 Base64 인코딩 및 디코딩을 어떻게 구현합니까? Base64 인코딩 및 디코딩의 4가지 방법 구현의 상세 내용입니다. 자세한 내용은 PHP 중국어 웹사이트의 기타 관련 기사를 참조하세요!

성명:
이 기사는 cnblogs.com에서 복제됩니다. 침해가 있는 경우 admin@php.cn으로 문의하시기 바랍니다. 삭제