ホームページ  >  記事  >  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%\jre\lib\rt を選択します。瓶。

方法 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

結論

Old sun.misc メソッドは最も効率が低く、xerces メソッドと Java8 メソッドが最も効率的です。 Java8 の利便性のため、エンコードとデコードには Java8 に付属の Base64 ツールを直接使用することをお勧めします。

以上がJava は Base64 エンコードとデコードをどのように実装しますか? Base64エンコードとデコードの4つのメソッドを実装の詳細内容です。詳細については、PHP 中国語 Web サイトの他の関連記事を参照してください。

声明:
この記事はcnblogs.comで複製されています。侵害がある場合は、admin@php.cn までご連絡ください。