001/* 002 * Copyright 2015-2024 the original author or authors 003 * 004 * This software is licensed under the Apache License, Version 2.0, 005 * the GNU Lesser General Public License version 2 or later ("LGPL") 006 * and the WTFPL. 007 * You may choose either license to govern your use of this software only 008 * upon the condition that you accept all of the terms of either 009 * the Apache License 2.0, the LGPL 2.1+ or the WTFPL. 010 */ 011package org.minidns.util; 012 013/** 014 * Very minimal Base64 encoder. 015 */ 016public final class Base64 { 017 private static final String ALPHABET = "ABCDEFGHIJKLMNOPQRSTUVWXYZabcdefghijklmnopqrstuvwxyz0123456789+/"; 018 private static final String PADDING = "=="; 019 020 /** 021 * Do not allow to instantiate Base64 022 */ 023 private Base64() { 024 } 025 026 public static String encodeToString(byte[] bytes) { 027 int paddingCount = (3 - (bytes.length % 3)) % 3; 028 byte[] padded = new byte[bytes.length + paddingCount]; 029 System.arraycopy(bytes, 0, padded, 0, bytes.length); 030 StringBuilder sb = new StringBuilder(); 031 for (int i = 0; i < bytes.length; i += 3) { 032 int j = ((padded[i] & 0xff) << 16) + ((padded[i + 1] & 0xff) << 8) + (padded[i + 2] & 0xff); 033 sb.append(ALPHABET.charAt((j >> 18) & 0x3f)).append(ALPHABET.charAt((j >> 12) & 0x3f)) 034 .append(ALPHABET.charAt((j >> 6) & 0x3f)).append(ALPHABET.charAt(j & 0x3f)); 035 } 036 return sb.substring(0, sb.length() - paddingCount) + PADDING.substring(0, paddingCount); 037 } 038}