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

📄 base64.java

📁 基于Jabber协议的即时消息服务器
💻 JAVA
📖 第 1 页 / 共 3 页
字号:

			try {
				// GZip -> Base64 -> ByteArray
				baos = new java.io.ByteArrayOutputStream();
				b64os = new Base64.OutputStream(baos, ENCODE | dontBreakLines);
				gzos = new java.util.zip.GZIPOutputStream(b64os);

				gzos.write(source, off, len);
				gzos.close();
			} // end try
			catch (java.io.IOException e) {
				e.printStackTrace();
				return null;
			} // end catch
			finally {
				try {
					gzos.close();
				} catch (Exception e) {
				}
				try {
					b64os.close();
				} catch (Exception e) {
				}
				try {
					baos.close();
				} catch (Exception e) {
				}
			} // end finally

			// Return value according to relevant encoding.
			try {
				return new String(baos.toByteArray(), PREFERRED_ENCODING);
			} // end try
			catch (java.io.UnsupportedEncodingException uue) {
				return new String(baos.toByteArray());
			} // end catch
		} // end if: compress

		// Else, don't compress. Better not to use streams at all then.
		else {
			// Convert option to boolean in way that code likes it.
			boolean breakLines = dontBreakLines == 0;

			int len43 = len * 4 / 3;
			byte[] outBuff = new byte[(len43) // Main 4:3
					+ ((len % 3) > 0 ? 4 : 0) // Account for padding
					+ (breakLines ? (len43 / MAX_LINE_LENGTH) : 0)]; // New
																		// lines
			int d = 0;
			int e = 0;
			int len2 = len - 2;
			int lineLength = 0;
			for (; d < len2; d += 3, e += 4) {
				encode3to4(source, d + off, 3, outBuff, e);

				lineLength += 4;
				if (breakLines && lineLength == MAX_LINE_LENGTH) {
					outBuff[e + 4] = NEW_LINE;
					e++;
					lineLength = 0;
				} // end if: end of line
			} // en dfor: each piece of array

			if (d < len) {
				encode3to4(source, d + off, len - d, outBuff, e);
				e += 4;
			} // end if: some padding needed

			// Return value according to relevant encoding.
			try {
				return new String(outBuff, 0, e, PREFERRED_ENCODING);
			} // end try
			catch (java.io.UnsupportedEncodingException uue) {
				return new String(outBuff, 0, e);
			} // end catch

		} // end else: don't compress

	} // end encodeBytes

	/* ******** D E C O D I N G M E T H O D S ******** */

	/**
	 * Decodes four bytes from array <var>source</var> and writes the resulting
	 * bytes (up to three of them) to <var>destination</var>. The source and
	 * destination arrays can be manipulated anywhere along their length by
	 * specifying <var>srcOffset</var> and <var>destOffset</var>. This method
	 * does not check to make sure your arrays are large enough to accomodate
	 * <var>srcOffset</var> + 4 for the <var>source</var> array or
	 * <var>destOffset</var> + 3 for the <var>destination</var> array. This
	 * method returns the actual number of bytes that were converted from the
	 * Base64 encoding.
	 * 
	 * @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) {
		// Example: Dk==
		if (source[srcOffset + 2] == EQUALS_SIGN) {
			// Two ways to do the same thing. Don't know which way I like best.
			// int outBuff = ( ( DECODABET[ source[ srcOffset ] ] << 24 ) >>> 6
			// )
			// | ( ( DECODABET[ source[ srcOffset + 1] ] << 24 ) >>> 12 );
			int outBuff = ((DECODABET[source[srcOffset]] & 0xFF) << 18)
					| ((DECODABET[source[srcOffset + 1]] & 0xFF) << 12);

			destination[destOffset] = (byte) (outBuff >>> 16);
			return 1;
		}

		// Example: DkL=
		else if (source[srcOffset + 3] == EQUALS_SIGN) {
			// Two ways to do the same thing. Don't know which way I like best.
			// int outBuff = ( ( DECODABET[ source[ srcOffset ] ] << 24 ) >>> 6
			// )
			// | ( ( DECODABET[ source[ srcOffset + 1 ] ] << 24 ) >>> 12 )
			// | ( ( DECODABET[ source[ srcOffset + 2 ] ] << 24 ) >>> 18 );
			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;
		}

		// Example: DkLE
		else {
			try {
				// Two ways to do the same thing. Don't know which way I like
				// best.
				// int outBuff = ( ( DECODABET[ source[ srcOffset ] ] << 24 )
				// >>> 6 )
				// | ( ( DECODABET[ source[ srcOffset + 1 ] ] << 24 ) >>> 12 )
				// | ( ( DECODABET[ source[ srcOffset + 2 ] ] << 24 ) >>> 18 )
				// | ( ( DECODABET[ source[ srcOffset + 3 ] ] << 24 ) >>> 24 );
				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;
			} // e nd catch
		}
	} // end decodeToBytes

	/**
	 * Very low-level access to decoding ASCII characters in the form of a byte
	 * array. Does not support automatically gunzipping or any other "fancy"
	 * features.
	 * 
	 * @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 = off; i < off + 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

	/**
	 * Decodes data from Base64 notation, automatically detecting
	 * gzip-compressed data and decompressing it.
	 * 
	 * @param s
	 *            the string to decode
	 * @return the decoded data
	 * @since 1.4
	 */
	public static byte[] decode(String s) {
		byte[] bytes;
		try {
			bytes = s.getBytes(PREFERRED_ENCODING);
		} // end try
		catch (java.io.UnsupportedEncodingException uee) {
			bytes = s.getBytes();
		} // end catch
		// </change>

		// Decode
		bytes = decode(bytes, 0, bytes.length);

		// Check to see if it's gzip-compressed
		// GZIP Magic Two-Byte Number: 0x8b1f (35615)
		if (bytes != null && bytes.length >= 4) {

			int head = ((int) bytes[0] & 0xff) | ((bytes[1] << 8) & 0xff00);
			if (java.util.zip.GZIPInputStream.GZIP_MAGIC == head) {
				java.io.ByteArrayInputStream bais = null;
				java.util.zip.GZIPInputStream gzis = null;
				java.io.ByteArrayOutputStream baos = null;
				byte[] buffer = new byte[2048];
				int length = 0;

				try {
					baos = new java.io.ByteArrayOutputStream();
					bais = new java.io.ByteArrayInputStream(bytes);
					gzis = new java.util.zip.GZIPInputStream(bais);

					while ((length = gzis.read(buffer)) >= 0) {
						baos.write(buffer, 0, length);
					} // end while: reading input

					// No error? Get new bytes.
					bytes = baos.toByteArray();

				} // end try
				catch (java.io.IOException e) {
					// Just return originally-decoded bytes
				} // end catch
				finally {
					try {
						baos.close();
					} catch (Exception e) {
					}
					try {
						gzis.close();
					} catch (Exception e) {
					}
					try {
						bais.close();
					} catch (Exception e) {
					}
				} // end finally

			} // end if: gzipped
		} // end if: bytes.length >= 2

		return bytes;
	} // end decode

	/**
	 * Attempts to decode Base64 data and deserialize a Java Object within.
	 * Returns <tt>null</tt> if there was an error.
	 * 
	 * @param encodedObject
	 *            The Base64 data to decode
	 * @return The decoded and deserialized object
	 * @since 1.5
	 */
	public static Object decodeToObject(String encodedObject) {
		// Decode and gunzip if necessary
		byte[] objBytes = decode(encodedObject);

		java.io.ByteArrayInputStream bais = null;
		java.io.ObjectInputStream ois = null;
		Object obj = null;

		try {
			bais = new java.io.ByteArrayInputStream(objBytes);
			ois = new java.io.ObjectInputStream(bais);

			obj = ois.readObject();
		} // end try
		catch (java.io.IOException e) {
			e.printStackTrace();
			obj = null;
		} // end catch
		catch (java.lang.ClassNotFoundException e) {
			e.printStackTrace();
			obj = null;
		} // end catch
		finally {
			try {
				bais.close();
			} catch (Exception e) {
			}
			try {
				ois.close();
			} catch (Exception e) {
			}
		} // end finally

		return obj;
	} // end decodeObject

	/**
	 * Convenience method for encoding data to a file.
	 * 
	 * @param dataToEncode
	 *            byte array of data to encode in base64 form
	 * @param filename
	 *            Filename for saving encoded data
	 * @return <tt>true</tt> if successful, <tt>false</tt> otherwise
	 * @since 2.1
	 */
	public static boolean encodeToFile(byte[] dataToEncode, String filename) {
		boolean success = false;
		Base64.OutputStream bos = null;
		try {
			bos = new Base64.OutputStream(
					new java.io.FileOutputStream(filename), Base64.ENCODE);
			bos.write(dataToEncode);
			success = true;
		} // end try
		catch (java.io.IOException e) {

			success = false;
		} // end catch: IOException
		finally {
			try {
				bos.close();
			} catch (Exception e) {
			}
		} // end finally

		return success;
	} // end encodeToFile

	/**
	 * Convenience method for decoding data to a file.
	 * 
	 * @param dataToDecode
	 *            Base64-encoded data as a string
	 * @param filename
	 *            Filename for saving decoded data
	 * @return <tt>true</tt> if successful, <tt>false</tt> otherwise
	 * @since 2.1
	 */
	public static boolean decodeToFile(String dataToDecode, String filename) {
		boolean success = false;
		Base64.OutputStream bos = null;
		try {
			bos = new Base64.OutputStream(
					new java.io.FileOutputStream(filename), Base64.DECODE);
			bos.write(dataToDecode.getBytes(PREFERRED_ENCODING));
			success = true;
		} // end try
		catch (java.io.IOException e) {
			success = false;
		} // end catch: IOException
		finally {
			try {
				bos.close();
			} catch (Exception e) {
			}
		} // end finally

		return success;
	} // end decodeToFile

	/**
	 * Convenience method for reading a base64-encoded file and decoding it.
	 * 
	 * @param filename
	 *            Filename for reading encoded data
	 * @return decoded byte array or null if unsuccessful
	 * @since 2.1
	 */
	public static byte[] decodeFromFile(String filename) {
		byte[] decodedData = null;
		Base64.InputStream bis = null;
		try {
			// Set up some useful variables
			java.io.File file = new java.io.File(filename);
			byte[] buffer = null;
			int length = 0;
			int numBytes = 0;

			// Check for size of file
			if (file.length() > Integer.MAX_VALUE) {
				System.err
						.println("File is too big for this convenience method ("
								+ file.length() + " bytes).");
				return null;
			} // end if: file too big for int index
			buffer = new byte[(int) file.length()];

			// Open a stream
			bis = new Base64.InputStream(new java.io.BufferedInputStream(
					new java.io.FileInputStream(file)), Base64.DECODE);

			// Read until done
			while ((numBytes = bis.read(buffer, length, 4096)) >= 0) {
				length += numBytes;
			}

			// Save in a variable to return
			decodedData = new byte[length];
			System.arraycopy(buffer, 0, decodedData, 0, length);

		} // end try
		catch (java.io.IOException e) {
			System.err.println("Error decoding from file " + filename);
		} // end catch: IOException
		finally {
			try {
				bis.close();
			} catch (Exception e) {
			}
		} // end finally

		return decodedData;
	} // end decodeFromFile

	/**
	 * Convenience method for reading a binary file and base64-encoding it.
	 * 
	 * @param filename
	 *            Filename for reading binary data
	 * @return base64-encoded string or null if unsuccessful
	 * @since 2.1
	 */
	public static String encodeFromFile(String filename) {
		String encodedData = null;
		Base64.InputStream bis = null;

⌨️ 快捷键说明

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