📄 base64.java
字号:
/**
* 将编码后的数据写入文件
*
* @param rawdata The data to write.
* @param file The file to read.
* @return Whether or not the write was a success.
* @since 1.4
*/
public static boolean encodeToFile( byte[] rawdata, String file )
{
return writeFile( rawdata, file, ENCODE );
} // end encodeFromFile
/**
* 将解码后的数据写入文件
*
* @param encdata The data to write.
* @param file The file to read.
* @return Whether or not the write was a success.
* @since 1.4
*/
public static boolean decodeToFile( byte[] encdata, String file )
{
return writeFile( encdata, file, DECODE );
} // end encodeFromFile
/* ******** D E C O D I N G M E T H O D S ******** */
/**
* 对fourBytes数组进行解码,并返回结果数组;
*
* @param fourBytes the array with Base64 content
* @return array with decoded values
* @since 1.3
*/
private static byte[] decode4to3( byte[] fourBytes )
{
byte[] outBuff1 = new byte[3];
int count = decode4to3( fourBytes, 0, outBuff1, 0 );
byte[] outBuff2 = new byte[ count ];
for( int i = 0; i < count; i++ )
outBuff2[i] = outBuff1[i];
return outBuff2;
}
/**
* 对source数组进行解码,并将结果写入destination数组。
* source和destination数组可以通过srcOffset和destOffset来确定起点。
* 该方法不会对数组大小进行验证,source数组满足srcOffset+3,以及destination数组满足destOffset+4。
*
* @param source the array to convert
* @param srcOffset the index where conversion begins
* @param destination the array to hold the conversion
* @param destOffset the index where output will be put
* @return the number of decoded bytes converted
* @since 1.3
*/
private static int decode4to3( byte[] source, int srcOffset, byte[] destination, int destOffset )
{
if( source[ srcOffset + 2] == EQUALS_SIGN )
{
int outBuff = ( ( DECODABET[ source[ srcOffset ] ] & 0xFF ) << 18 )
| ( ( DECODABET[ source[ srcOffset + 1] ] & 0xFF ) << 12 );
destination[ destOffset ] = (byte)( outBuff >>> 16 );
return 1;
}
else if( source[ srcOffset + 3 ] == EQUALS_SIGN )
{
int outBuff = ( ( DECODABET[ source[ srcOffset ] ] & 0xFF ) << 18 )
| ( ( DECODABET[ source[ srcOffset + 1 ] ] & 0xFF ) << 12 )
| ( ( DECODABET[ source[ srcOffset + 2 ] ] & 0xFF ) << 6 );
destination[ destOffset ] = (byte)( outBuff >>> 16 );
destination[ destOffset + 1 ] = (byte)( outBuff >>> 8 );
return 2;
}
else
{
try{
int outBuff = ( ( DECODABET[ source[ srcOffset ] ] & 0xFF ) << 18 )
| ( ( DECODABET[ source[ srcOffset + 1 ] ] & 0xFF ) << 12 )
| ( ( DECODABET[ source[ srcOffset + 2 ] ] & 0xFF ) << 6)
| ( ( DECODABET[ source[ srcOffset + 3 ] ] & 0xFF ) );
destination[ destOffset ] = (byte)( outBuff >> 16 );
destination[ destOffset + 1 ] = (byte)( outBuff >> 8 );
destination[ destOffset + 2 ] = (byte)( outBuff );
return 3;
}catch( Exception e){
System.out.println(""+source[srcOffset]+ ": " + ( DECODABET[ source[ srcOffset ] ] ) );
System.out.println(""+source[srcOffset+1]+ ": " + ( DECODABET[ source[ srcOffset + 1 ] ] ) );
System.out.println(""+source[srcOffset+2]+ ": " + ( DECODABET[ source[ srcOffset + 2 ] ] ) );
System.out.println(""+source[srcOffset+3]+ ": " + ( DECODABET[ source[ srcOffset + 3 ] ] ) );
return -1;
} //end catch
}
} // end decodeToBytes
/**
* 调用decode方法进行解码
*
* @param s the string to decode
* @return the decoded data
* @since 1.4
*/
public static byte[] decode( String s )
{
byte[] bytes = s.getBytes();
return decode( bytes, 0, bytes.length );
} // end decode
/**
* 对数据进行解码,并将其作为String返回
*
* @param s the strind to decode
* @return The data as a string
* @since 1.4
*/
public static String decodeToString( String s )
{ return new String( decode( s ) );
} // end decodeToString
/**
* 对Base64规范的数据进行解码,并且反串行化得到一个Java对象,如果遇到错误则返回Null
*
* @param encodedObject The Base64 data to decode
* @return The decoded and deserialized object
* @since 1.4
*/
public static Object decodeToObject( String encodedObject )
{
byte[] objBytes = decode( encodedObject );
java.io.ByteArrayInputStream bais = null;
java.io.ObjectInputStream ois = null;
try
{
bais = new java.io.ByteArrayInputStream( objBytes );
ois = new java.io.ObjectInputStream( bais );
return ois.readObject();
} // end try
catch( java.io.IOException e )
{
e.printStackTrace();
return null;
} // end catch
catch( java.lang.ClassNotFoundException e )
{
e.printStackTrace();
return null;
} // end catch
finally
{
try{ bais.close(); } catch( Exception e ){}
try{ ois.close(); } catch( Exception e ){}
} // end finally
} // end decodeObject
/**
* 按照字节数组的格式对Base64规范的内容进行解码,并且返回解码后的字节数组;
*
* @param source The Base64 encoded data
* @param off The offset of where to begin decoding
* @param len The length of characters to decode
* @return decoded data
* @since 1.3
*/
public static byte[] decode( byte[] source, int off, int len )
{
int len34 = len * 3 / 4;
byte[] outBuff = new byte[ len34 ]; // Upper limit on size of output
int outBuffPosn = 0;
byte[] b4 = new byte[4];
int b4Posn = 0;
int i = 0;
byte sbiCrop = 0;
byte sbiDecode = 0;
for( i = 0; i < len; i++ )
{
sbiCrop = (byte)(source[i] & 0x7f); // Only the low seven bits
sbiDecode = DECODABET[ sbiCrop ];
if( sbiDecode >= WHITE_SPACE_ENC ) // White space, Equals sign or better
{
if( sbiDecode >= EQUALS_SIGN_ENC )
{
b4[ b4Posn++ ] = sbiCrop;
if( b4Posn > 3 )
{
outBuffPosn += decode4to3( b4, 0, outBuff, outBuffPosn );
b4Posn = 0;
// If that was the equals sign, break out of 'for' loop
if( sbiCrop == EQUALS_SIGN )
break;
} // end if: quartet built
} // end if: equals sign or better
} // end if: white space, equals sign or better
else
{
System.err.println( "Bad Base64 input character at " + i + ": " + source[i] + "(decimal)" );
return null;
} // end else:
} // each input character
byte[] out = new byte[ outBuffPosn ];
System.arraycopy( outBuff, 0, out, 0, outBuffPosn );
return out;
} // end decode
/* ******** I N N E R C L A S S I N P U T S T R E A M ******** */
/**
* 定义一个InputStream类,用来读取数据。
*
* @see Base64
* @see java.io.FilterInputStream
* @since 1.3
*/
public static class InputStream extends java.io.FilterInputStream
{
private boolean encode; // Encoding or decoding
private int position; // Current position in the buffer
private byte[] buffer; // Small buffer holding converted data
private int bufferLength; // Length of buffer (3 or 4)
private int numSigBytes; // Number of meaningful bytes in the buffer
private int lineLength;
private boolean breakLines; // Break lines at less than 80 characters
/**
* 构造一个解码模式的类对象;
*
* @param in the {@link java.io.InputStream} from which to read data.
* @since 1.3
*/
public InputStream( java.io.InputStream in )
{
this( in, Base64.DECODE );
} // end constructor
/**
* 根据encode参数来判断该对象采用的模式;
*
* @param in the {@link java.io.InputStream} from which to read data.
* @param encode Conversion direction
* @see Base64#ENCODE
* @see Base64#DECODE
* @since 1.3
*/
public InputStream( java.io.InputStream in, boolean encode )
{
this( in, encode, true );
} // end constructor
/**
* 根据encode参数判断该类对象是编码模式还是解码模式,breakLines参数会将每行所包含的字符不超过80
*
* @param in the {@link java.io.InputStream} from which to read data.
* @param encode Conversion direction
* @param breakLines Break lines at less than 80 characters.
* @see Base64#ENCODE
* @see Base64#DECODE
* @since 1.3
*/
public InputStream( java.io.InputStream in, boolean encode, boolean breakLines )
{
super( in );
this.breakLines = breakLines;
this.encode = encode;
this.bufferLength = encode ? 4 : 3;
this.buffer = new byte[ bufferLength ];
this.position = -1;
this.lineLength = 0;
} // end constructor
/**
* 从输入流中读取足够的数据来进行Base64规范的编码或解码,并且返回下一个字节。
*
* @return next byte
* @since 1.3
*/
public int read() throws java.io.IOException
{
// Do we need to get data?
if( position < 0 )
{
if( encode )
{
byte[] b3 = new byte[3];
int numBinaryBytes = 0;
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -