📄 bytetocharutf7converter.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 + -