All Downloads are FREE. Search and download functionalities are using the official Maven repository.

com.dahuatech.icc.util.Base64Util Maven / Gradle / Ivy

/*
 * Copyright 2017 Baidu, Inc.
 *
 * Licensed under the Apache License, Version 2.0 (the "License"); you may not use this file except in compliance with
 * the License. You may obtain a copy of the License at
 *
 * http://www.apache.org/licenses/LICENSE-2.0
 *
 * Unless required by applicable law or agreed to in writing, software distributed under the License is distributed on
 * an "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. See the License for the
 * specific language governing permissions and limitations under the License.
 */
package com.dahuatech.icc.util;

/**
 * @author 232676
 * @since 1.0.0 2020-10-24 20:59:11
 */
public class Base64Util {
  private static final char[] ALPHABET =
      "ABCDEFGHIJKLMNOPQRSTUVWXYZabcdefghijklmnopqrstuvwxyz0123456789+/".toCharArray();

  private static final char last2byte = (char) Integer.parseInt("00000011", 2);
  private static final char last4byte = (char) Integer.parseInt("00001111", 2);
  private static final char last6byte = (char) Integer.parseInt("00111111", 2);
  private static final char lead6byte = (char) Integer.parseInt("11111100", 2);
  private static final char lead4byte = (char) Integer.parseInt("11110000", 2);
  private static final char lead2byte = (char) Integer.parseInt("11000000", 2);
  private static final char[] encodeTable =
      new char[] {
        'A', 'B', 'C', 'D', 'E', 'F', 'G', 'H', 'I', 'J', 'K', 'L', 'M', 'N', 'O', 'P', 'Q', 'R',
        'S', 'T', 'U', 'V', 'W', 'X', 'Y', 'Z', 'a', 'b', 'c', 'd', 'e', 'f', 'g', 'h', 'i', 'j',
        'k', 'l', 'm', 'n', 'o', 'p', 'q', 'r', 's', 't', 'u', 'v', 'w', 'x', 'y', 'z', '0', '1',
        '2', '3', '4', '5', '6', '7', '8', '9', '+', '/'
      };

  private static int[] toInt = new int[128];

  static {
    for (int i = 0; i < ALPHABET.length; i++) {
      toInt[ALPHABET[i]] = i;
    }
  }

  /**
   * Base64 encoding.
   *
   * @param from The src data.
   * @return cryto_str
   */
  public static String encode(byte[] from) {
    StringBuilder to = new StringBuilder((int) (from.length * 1.34) + 3);
    int num = 0;
    char currentByte = 0;
    for (int i = 0; i < from.length; i++) {
      num = num % 8;
      while (num < 8) {
        switch (num) {
          case 0:
            currentByte = (char) (from[i] & lead6byte);
            currentByte = (char) (currentByte >>> 2);
            break;
          case 2:
            currentByte = (char) (from[i] & last6byte);
            break;
          case 4:
            currentByte = (char) (from[i] & last4byte);
            currentByte = (char) (currentByte << 2);
            if ((i + 1) < from.length) {
              currentByte |= (from[i + 1] & lead2byte) >>> 6;
            }
            break;
          case 6:
            currentByte = (char) (from[i] & last2byte);
            currentByte = (char) (currentByte << 4);
            if ((i + 1) < from.length) {
              currentByte |= (from[i + 1] & lead4byte) >>> 4;
            }
            break;
          default:
            break;
        }
        to.append(encodeTable[currentByte]);
        num += 6;
      }
    }
    if (to.length() % 4 != 0) {
      for (int i = 4 - to.length() % 4; i > 0; i--) {
        to.append("=");
      }
    }
    return to.toString();
  }

  /**
   * Translates the specified Base64 string into a byte array.
   *
   * @param s the Base64 string (not null)
   * @return the byte array (not null)
   */
  public static byte[] decode(String s) {
    int delta = s.endsWith("==") ? 2 : s.endsWith("=") ? 1 : 0;
    byte[] buffer = new byte[s.length() * 3 / 4 - delta];
    int mask = 0xFF;
    int index = 0;
    for (int i = 0; i < s.length(); i += 4) {
      int c0 = toInt[s.charAt(i)];
      int c1 = toInt[s.charAt(i + 1)];
      buffer[index++] = (byte) (((c0 << 2) | (c1 >> 4)) & mask);
      if (index >= buffer.length) {
        return buffer;
      }
      int c2 = toInt[s.charAt(i + 2)];
      buffer[index++] = (byte) (((c1 << 4) | (c2 >> 2)) & mask);
      if (index >= buffer.length) {
        return buffer;
      }
      int c3 = toInt[s.charAt(i + 3)];
      buffer[index++] = (byte) (((c2 << 6) | c3) & mask);
    }
    return buffer;
  }
}




© 2015 - 2024 Weber Informatics LLC | Privacy Policy