⭐ 欢迎来到虫虫下载站! | 📦 资源下载 📁 资源专辑 ℹ️ 关于我们
⭐ 虫虫下载站

📄 bytetocharutf7converter.java

📁 spam source codejasen-0.9jASEN - java Anti Spam ENgine.zip 如标题所示
💻 JAVA
字号:
/*
 * @(#)ByteToCharUTF7Converter.java	 12/05/2004
 *
 * Copyright (c) 2004, 2005  jASEN.org
 * All rights reserved.
 *
 * Redistribution and use in source and binary forms, with or without
 * modification, are permitted provided that the following conditions are met:
 *
 *   1. Redistributions of source code must retain the above copyright notice,
 *      this list of conditions and the following disclaimer.
 *
 *   2. Redistributions in binary form must reproduce the above copyright
 *      notice, this list of conditions and the following disclaimer in
 *      the documentation and/or other materials provided with the distribution.
 *
 *   3. The names of the authors may not be used to endorse or promote products
 *      derived from this software without specific prior written permission.
 *
 *   4. Any modification or additions to the software must be contributed back
 *      to the project.
 *
 *   5. Any investigation or reverse engineering of source code or binary to
 *      enable emails to bypass the filters, and hence inflict spam and or viruses
 *      onto users who use or do not use jASEN could subject the perpetrator to
 *      criminal and or civil liability.
 *
 * THIS SOFTWARE IS PROVIDED "AS IS" AND ANY EXPRESSED OR IMPLIED WARRANTIES,
 * INCLUDING, BUT NOT LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND
 * FITNESS FOR A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL JASEN.ORG,
 * OR ANY CONTRIBUTORS TO THIS SOFTWARE BE LIABLE FOR ANY DIRECT, INDIRECT,
 * INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT
 * LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA,
 * OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF
 * LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING
 * NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE,
 * EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
 *
 */
package org.jasen.io;

/**
 *
 * <P>
 * 	ByteToCharUTF7Converter Converts UTF-7 encoded bytes into Unicode 16 chars.
 * </P>
 * <p>
 * 	This is required because as of the time of writing, the JDK does not include a UTF7 decoder,
 * 	however this is quite a common encoding in RFC822 (MIME) messages.
 * </p>
 * @author Jason Polites
 */
public class ByteToCharUTF7Converter extends sun.io.ByteToCharConverter {

	public static final String BASE64 = "ABCDEFGHIJKLMNOPQRSTUVWXYZabcdefghijklmnopqrstuvwxyz0123456789+/";

	private boolean b64Context = false;
	private int currentB64Off = 0;
	private char currentChar = 0;

	/*
	 * (non-Javadoc)
	 * @see sun.io.ByteToCharConverter#getCharacterEncoding()
	 */
	public String getCharacterEncoding() {
		return "UTF7";
	}

	/*
	 * (non-Javadoc)
	 * @see sun.io.ByteToCharConverter#flush(char[], int, int)
	 */
	public int flush(char[] chars, int off, int len) {
		byteOff = 0;
		charOff = 0;
		b64Context = false;
		currentB64Off = 0;
		currentChar = 0;
		return 0;
	}

	/*
	 * (non-Javadoc)
	 * @see sun.io.ByteToCharConverter#reset()
	 */
	public void reset() {
		byteOff = 0;
		charOff = 0;
		b64Context = false;
		currentB64Off = 0;
		currentChar = 0;
	}

	/*
	 * (non-Javadoc)
	 * @see sun.io.ByteToCharConverter#convert(byte[], int, int, char[], int, int)
	 */
	public int convert(byte[] bytes, int byteStart, int byteEnd, char[] chars, int charStart, int charEnd) throws sun.io.ConversionBufferFullException, sun.io.UnknownCharacterException {
		charOff = charStart;

		for (byteOff = byteStart; byteOff < byteEnd; byteOff++) {
			if (charOff >= charEnd) {
				throw new sun.io.ConversionBufferFullException();
			}
			if (b64Context) {
				if (bytes[byteOff] == '-') {
					if (currentB64Off != 0 && currentChar > 0) {
						chars[charOff] = currentChar;
						charOff++;
					}
					b64Context = false;
					continue;
				}
				int part = BASE64.indexOf(bytes[byteOff]);
				if (part == -1) {
					throw new sun.io.UnknownCharacterException("Invalid UTF-7 code: " + (char) bytes[byteOff]);
				}

				switch (currentB64Off) {
					case 0 :
						currentChar = (char) (part << 10);
						break;
					case 1 :
						currentChar |= (char) (part << 4);
						break;
					case 2 :
						currentChar |= (char) (part >> 2);
						chars[charOff] = currentChar;
						charOff++;
						currentChar = (char) ((part & 0x03) << 14);
						break;
					case 3 :
						currentChar |= (char) (part << 8);
						break;
					case 4 :
						currentChar |= (char) (part << 2);
						break;
					case 5 :
						currentChar |= (char) (part >> 4);
						chars[charOff] = currentChar;
						charOff++;
						currentChar = (char) ((part & 0x0f) << 12);
						break;
					case 6 :
						currentChar |= (char) (part << 6);
						break;
					case 7 :
						currentChar |= (char) part;
						chars[charOff] = currentChar;
						charOff++;
						break;
				}
				currentB64Off = (currentB64Off + 1) % 8;
				continue;
			}

			if (bytes[byteOff] == '+') {
				// shift character
				// This is start of the Base64 sequence.
				b64Context = true;
				currentB64Off = 0;
				continue;
			}
			chars[charOff] = (char) bytes[byteOff];
			charOff++;
		}
		return charOff - charStart;
	}
}

⌨️ 快捷键说明

复制代码 Ctrl + C
搜索代码 Ctrl + F
全屏模式 F11
切换主题 Ctrl + Shift + D
显示快捷键 ?
增大字号 Ctrl + =
减小字号 Ctrl + -