Java tutorial
//package com.java2s; /**************************************************************** * Licensed to the Apache Software Foundation (ASF) under one * * or more contributor license agreements. See the NOTICE file * * distributed with this work for additional information * * regarding copyright ownership. The ASF licenses this file * * to you 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. * ****************************************************************/ import java.nio.ByteBuffer; import java.nio.charset.Charset; public class Main { static final byte[] BASE64_TABLE = { '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 final byte BASE64_PAD = '='; private static final String ENC_WORD_SUFFIX = "?="; private static final int ENCODED_WORD_MAX_LENGTH = 75; /** * Encodes the specified byte array using the B encoding defined in RFC * 2047. * * @param bytes * byte array to encode. * @return encoded string. */ public static String encodeB(byte[] bytes) { StringBuilder sb = new StringBuilder(); int idx = 0; final int end = bytes.length; for (; idx < end - 2; idx += 3) { int data = (bytes[idx] & 0xff) << 16 | (bytes[idx + 1] & 0xff) << 8 | bytes[idx + 2] & 0xff; sb.append((char) BASE64_TABLE[data >> 18 & 0x3f]); sb.append((char) BASE64_TABLE[data >> 12 & 0x3f]); sb.append((char) BASE64_TABLE[data >> 6 & 0x3f]); sb.append((char) BASE64_TABLE[data & 0x3f]); } if (idx == end - 2) { int data = (bytes[idx] & 0xff) << 16 | (bytes[idx + 1] & 0xff) << 8; sb.append((char) BASE64_TABLE[data >> 18 & 0x3f]); sb.append((char) BASE64_TABLE[data >> 12 & 0x3f]); sb.append((char) BASE64_TABLE[data >> 6 & 0x3f]); sb.append((char) BASE64_PAD); } else if (idx == end - 1) { int data = (bytes[idx] & 0xff) << 16; sb.append((char) BASE64_TABLE[data >> 18 & 0x3f]); sb.append((char) BASE64_TABLE[data >> 12 & 0x3f]); sb.append((char) BASE64_PAD); sb.append((char) BASE64_PAD); } return sb.toString(); } private static String encodeB(String prefix, String text, int usedCharacters, Charset charset, byte[] bytes) { int encodedLength = bEncodedLength(bytes); int totalLength = prefix.length() + encodedLength + ENC_WORD_SUFFIX.length(); if (totalLength <= ENCODED_WORD_MAX_LENGTH - usedCharacters) { return prefix + encodeB(bytes) + ENC_WORD_SUFFIX; } else { int splitOffset = text.offsetByCodePoints(text.length() / 2, -1); String part1 = text.substring(0, splitOffset); byte[] bytes1 = encode(part1, charset); String word1 = encodeB(prefix, part1, usedCharacters, charset, bytes1); String part2 = text.substring(splitOffset); byte[] bytes2 = encode(part2, charset); String word2 = encodeB(prefix, part2, 0, charset, bytes2); return word1 + " " + word2; } } private static int bEncodedLength(byte[] bytes) { return (bytes.length + 2) / 3 * 4; } private static byte[] encode(String text, Charset charset) { ByteBuffer buffer = charset.encode(text); byte[] bytes = new byte[buffer.limit()]; buffer.get(bytes); return bytes; } }