- 浏览: 182972 次
- 性别:
- 来自: 北京
最新评论
-
u011374223:
获取颜色的方法有两个,07xssfWORKBOOK的需要用这个 ...
apache poi读取excel中的颜色,真是坑爹啊 -
zhangtcb:
读取的颜色和Excel中的不一样啊
apache poi读取excel中的颜色,真是坑爹啊 -
LD_21:
...
log4j日志文件的相对路径 -
xfxlch:
upThx
来,让我们一起画个印章吧 -
xinxinlong:
单元格的style里面有个颜色,如果双击单元格,里面的文字选中 ...
apache poi读取excel中的颜色,真是坑爹啊
一直使用sun的base64,但是感觉不是很好,毕竟不是标准包中的.
所以把codec中的base64摘出来,以备后用
/* * 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.io.UnsupportedEncodingException; import java.math.BigInteger; /** * Provides Base64 encoding and decoding as defined by RFC 2045. * * <p> * This class implements section <cite>6.8. Base64 * Content-Transfer-Encoding</cite> from RFC 2045 <cite>Multipurpose Internet * Mail Extensions (MIME) Part One: Format of Internet Message Bodies</cite> by * Freed and Borenstein. * </p> * <p> * The class can be parameterized in the following manner with various * constructors: * <ul> * <li>URL-safe mode: Default off.</li> * <li>Line length: Default 76. Line length that aren't multiples of 4 will * still essentially end up being multiples of 4 in the encoded data. * <li>Line separator: Default is CRLF ("\r\n")</li> * </ul> * </p> * <p> * Since this class operates directly on byte streams, and not character * streams, it is hard-coded to only encode/decode character encodings which are * compatible with the lower 127 ASCII chart (ISO-8859-1, Windows-1252, UTF-8, * etc). * </p> * * @see <a href="http://www.ietf.org/rfc/rfc2045.txt">RFC 2045</a> * @author Apache Software Foundation * @since 1.0 * @version $Id: Base64.java 801706 2009-08-06 16:27:06Z niallp $ */ public class Base64 { private static final int DEFAULT_BUFFER_RESIZE_FACTOR = 2; private static final int DEFAULT_BUFFER_SIZE = 8192; /** * Chunk size per RFC 2045 section 6.8. * * <p> * The {@value} character limit does not count the trailing CRLF, but counts * all other characters, including any equal signs. * </p> * * @see <a href="http://www.ietf.org/rfc/rfc2045.txt">RFC 2045 section * 6.8</a> */ static final int CHUNK_SIZE = 76; /** * Chunk separator per RFC 2045 section 2.1. * * <p> * N.B. The next major release may break compatibility and make this field * private. * </p> * * @see <a href="http://www.ietf.org/rfc/rfc2045.txt">RFC 2045 section * 2.1</a> */ static final byte[] CHUNK_SEPARATOR = { '\r', '\n' }; /** * This array is a lookup table that translates 6-bit positive integer index * values into their "Base64 Alphabet" equivalents as specified in Table 1 * of RFC 2045. * * Thanks to "commons" project in ws.apache.org for this code. * http://svn.apache.org/repos/asf/webservices/commons/trunk/modules/util/ */ private static final byte[] STANDARD_ENCODE_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', '+', '/' }; /** * This is a copy of the STANDARD_ENCODE_TABLE above, but with + and / * changed to - and _ to make the encoded Base64 results more URL-SAFE. This * table is only used when the Base64's mode is set to URL-SAFE. */ private static final byte[] URL_SAFE_ENCODE_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', '-', '_' }; /** * Byte used to pad output. */ private static final byte PAD = '='; /** * This array is a lookup table that translates Unicode characters drawn * from the "Base64 Alphabet" (as specified in Table 1 of RFC 2045) into * their 6-bit positive integer equivalents. Characters that are not in the * Base64 alphabet but fall within the bounds of the array are translated to * -1. * * Note: '+' and '-' both decode to 62. '/' and '_' both decode to 63. This * means decoder seamlessly handles both URL_SAFE and STANDARD base64. (The * encoder, on the other hand, needs to know ahead of time what to emit). * * Thanks to "commons" project in ws.apache.org for this code. * http://svn.apache.org/repos/asf/webservices/commons/trunk/modules/util/ */ private static final byte[] DECODE_TABLE = { -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, 62, -1, 62, -1, 63, 52, 53, 54, 55, 56, 57, 58, 59, 60, 61, -1, -1, -1, -1, -1, -1, -1, 0, 1, 2, 3, 4, 5, 6, 7, 8, 9, 10, 11, 12, 13, 14, 15, 16, 17, 18, 19, 20, 21, 22, 23, 24, 25, -1, -1, -1, -1, 63, -1, 26, 27, 28, 29, 30, 31, 32, 33, 34, 35, 36, 37, 38, 39, 40, 41, 42, 43, 44, 45, 46, 47, 48, 49, 50, 51 }; /** Mask used to extract 6 bits, used when encoding */ private static final int MASK_6BITS = 0x3f; /** Mask used to extract 8 bits, used in decoding base64 bytes */ private static final int MASK_8BITS = 0xff; // The static final fields above are used for the original static byte[] // methods on Base64. // The private member fields below are used with the new streaming approach, // which requires // some state be preserved between calls of encode() and decode(). /** * Encode table to use: either STANDARD or URL_SAFE. Note: the DECODE_TABLE * above remains static because it is able to decode both STANDARD and * URL_SAFE streams, but the encodeTable must be a member variable so we can * switch between the two modes. */ private final byte[] encodeTable; /** * Line length for encoding. Not used when decoding. A value of zero or less * implies no chunking of the base64 encoded data. */ private final int lineLength; /** * Line separator for encoding. Not used when decoding. Only used if * lineLength > 0. */ private final byte[] lineSeparator; /** * Convenience variable to help us determine when our buffer is going to run * out of room and needs resizing. * <code>decodeSize = 3 + lineSeparator.length;</code> */ private final int decodeSize; /** * Convenience variable to help us determine when our buffer is going to run * out of room and needs resizing. * <code>encodeSize = 4 + lineSeparator.length;</code> */ private final int encodeSize; /** * Buffer for streaming. */ private byte[] buffer; /** * Position where next character should be written in the buffer. */ private int pos; /** * Position where next character should be read from the buffer. */ private int readPos; /** * Variable tracks how many characters have been written to the current * line. Only used when encoding. We use it to make sure each encoded line * never goes beyond lineLength (if lineLength > 0). */ private int currentLinePos; /** * Writes to the buffer only occur after every 3 reads when encoding, an * every 4 reads when decoding. This variable helps track that. */ private int modulus; /** * Boolean flag to indicate the EOF has been reached. Once EOF has been * reached, this Base64 object becomes useless, and must be thrown away. */ private boolean eof; /** * Place holder for the 3 bytes we're dealing with for our base64 logic. * Bitwise operations store and extract the base64 encoding or decoding from * this variable. */ private int x; /** * Creates a Base64 codec used for decoding (all modes) and encoding in * URL-unsafe mode. * <p> * When encoding the line length is 76, the line separator is CRLF, and the * encoding table is STANDARD_ENCODE_TABLE. * </p> * * <p> * When decoding all variants are supported. * </p> */ public Base64() { this(false); } /** * Creates a Base64 codec used for decoding (all modes) and encoding in the * given URL-safe mode. * <p> * When encoding the line length is 76, the line separator is CRLF, and the * encoding table is STANDARD_ENCODE_TABLE. * </p> * * <p> * When decoding all variants are supported. * </p> * * @param urlSafe * if <code>true</code>, URL-safe encoding is used. In most cases * this should be set to <code>false</code>. * @since 1.4 */ public Base64(boolean urlSafe) { this(CHUNK_SIZE, CHUNK_SEPARATOR, urlSafe); } /** * Creates a Base64 codec used for decoding (all modes) and encoding in * URL-unsafe mode. * <p> * When encoding the line length is given in the constructor, the line * separator is CRLF, and the encoding table is STANDARD_ENCODE_TABLE. * </p> * <p> * Line lengths that aren't multiples of 4 will still essentially end up * being multiples of 4 in the encoded data. * </p> * <p> * When decoding all variants are supported. * </p> * * @param lineLength * Each line of encoded data will be at most of the given length * (rounded down to nearest multiple of 4). If lineLength <= 0, * then the output will not be divided into lines (chunks). * Ignored when decoding. * @since 1.4 */ public Base64(int lineLength) { this(lineLength, CHUNK_SEPARATOR); } /** * Creates a Base64 codec used for decoding (all modes) and encoding in * URL-unsafe mode. * <p> * When encoding the line length and line separator are given in the * constructor, and the encoding table is STANDARD_ENCODE_TABLE. * </p> * <p> * Line lengths that aren't multiples of 4 will still essentially end up * being multiples of 4 in the encoded data. * </p> * <p> * When decoding all variants are supported. * </p> * * @param lineLength * Each line of encoded data will be at most of the given length * (rounded down to nearest multiple of 4). If lineLength <= 0, * then the output will not be divided into lines (chunks). * Ignored when decoding. * @param lineSeparator * Each line of encoded data will end with this sequence of * bytes. * @throws IllegalArgumentException * Thrown when the provided lineSeparator included some base64 * characters. * @since 1.4 */ public Base64(int lineLength, byte[] lineSeparator) { this(lineLength, lineSeparator, false); } /** * Creates a Base64 codec used for decoding (all modes) and encoding in * URL-unsafe mode. * <p> * When encoding the line length and line separator are given in the * constructor, and the encoding table is STANDARD_ENCODE_TABLE. * </p> * <p> * Line lengths that aren't multiples of 4 will still essentially end up * being multiples of 4 in the encoded data. * </p> * <p> * When decoding all variants are supported. * </p> * * @param lineLength * Each line of encoded data will be at most of the given length * (rounded down to nearest multiple of 4). If lineLength <= 0, * then the output will not be divided into lines (chunks). * Ignored when decoding. * @param lineSeparator * Each line of encoded data will end with this sequence of * bytes. * @param urlSafe * Instead of emitting '+' and '/' we emit '-' and '_' * respectively. urlSafe is only applied to encode operations. * Decoding seamlessly handles both modes. * @throws IllegalArgumentException * The provided lineSeparator included some base64 characters. * That's not going to work! * @since 1.4 */ public Base64(int lineLength, byte[] lineSeparator, boolean urlSafe) { if (lineSeparator == null) { lineLength = 0; // disable chunk-separating lineSeparator = CHUNK_SEPARATOR; // this just gets ignored } this.lineLength = lineLength > 0 ? lineLength / 4 * 4 : 0; this.lineSeparator = new byte[lineSeparator.length]; System.arraycopy(lineSeparator, 0, this.lineSeparator, 0, lineSeparator.length); if (lineLength > 0) { encodeSize = 4 + lineSeparator.length; } else { encodeSize = 4; } decodeSize = encodeSize - 1; if (containsBase64Byte(lineSeparator)) { String sep = newStringUtf8(lineSeparator); throw new IllegalArgumentException( "lineSeperator must not contain base64 characters: [" + sep + "]"); } encodeTable = urlSafe ? URL_SAFE_ENCODE_TABLE : STANDARD_ENCODE_TABLE; } private static String newStringUtf8(byte[] chars) { if (chars == null) { return null; } try { return new String(chars, "UTF-8"); } catch (UnsupportedEncodingException e) { return null; } } /** * Returns our current encode mode. True if we're URL-SAFE, false otherwise. * * @return true if we're in URL-SAFE mode, false otherwise. * @since 1.4 */ public boolean isUrlSafe() { return encodeTable == URL_SAFE_ENCODE_TABLE; } /** * Returns true if this Base64 object has buffered data for reading. * * @return true if there is Base64 object still available for reading. */ boolean hasData() { return buffer != null; } /** * Returns the amount of buffered data available for reading. * * @return The amount of buffered data available for reading. */ int avail() { return buffer != null ? pos - readPos : 0; } /** Doubles our buffer. */ private void resizeBuffer() { if (buffer == null) { buffer = new byte[DEFAULT_BUFFER_SIZE]; pos = 0; readPos = 0; } else { byte[] b = new byte[buffer.length * DEFAULT_BUFFER_RESIZE_FACTOR]; System.arraycopy(buffer, 0, b, 0, buffer.length); buffer = b; } } /** * Extracts buffered data into the provided byte[] array, starting at * position bPos, up to a maximum of bAvail bytes. Returns how many bytes * were actually extracted. * * @param b * byte[] array to extract the buffered data into. * @param bPos * position in byte[] array to start extraction at. * @param bAvail * amount of bytes we're allowed to extract. We may extract fewer * (if fewer are available). * @return The number of bytes successfully extracted into the provided * byte[] array. */ int readResults(byte[] b, int bPos, int bAvail) { if (buffer != null) { int len = Math.min(avail(), bAvail); if (buffer != b) { System.arraycopy(buffer, readPos, b, bPos, len); readPos += len; if (readPos >= pos) { buffer = null; } } else { // Re-using the original consumer's output array is only // allowed for one round. buffer = null; } return len; } return eof ? -1 : 0; } /** * Sets the streaming buffer. This is a small optimization where we try to * buffer directly to the consumer's output array for one round (if the * consumer calls this method first) instead of starting our own buffer. * * @param out * byte[] array to buffer directly to. * @param outPos * Position to start buffering into. * @param outAvail * Amount of bytes available for direct buffering. */ void setInitialBuffer(byte[] out, int outPos, int outAvail) { // We can re-use consumer's original output array under // special circumstances, saving on some System.arraycopy(). if (out != null && out.length == outAvail) { buffer = out; pos = outPos; readPos = outPos; } } /** * <p> * Encodes all of the provided data, starting at inPos, for inAvail bytes. * Must be called at least twice: once with the data to encode, and once * with inAvail set to "-1" to alert encoder that EOF has been reached, so * flush last remaining bytes (if not multiple of 3). * </p> * <p> * Thanks to "commons" project in ws.apache.org for the bitwise operations, * and general approach. * http://svn.apache.org/repos/asf/webservices/commons/trunk/modules/util/ * </p> * * @param in * byte[] array of binary data to base64 encode. * @param inPos * Position to start reading data from. * @param inAvail * Amount of bytes available from input for encoding. */ void encode(byte[] in, int inPos, int inAvail) { if (eof) { return; } // inAvail < 0 is how we're informed of EOF in the underlying data we're // encoding. if (inAvail < 0) { eof = true; if (buffer == null || buffer.length - pos < encodeSize) { resizeBuffer(); } switch (modulus) { case 1: buffer[pos++] = encodeTable[x >> 2 & MASK_6BITS]; buffer[pos++] = encodeTable[x << 4 & MASK_6BITS]; // URL-SAFE skips the padding to further reduce size. if (encodeTable == STANDARD_ENCODE_TABLE) { buffer[pos++] = PAD; buffer[pos++] = PAD; } break; case 2: buffer[pos++] = encodeTable[x >> 10 & MASK_6BITS]; buffer[pos++] = encodeTable[x >> 4 & MASK_6BITS]; buffer[pos++] = encodeTable[x << 2 & MASK_6BITS]; // URL-SAFE skips the padding to further reduce size. if (encodeTable == STANDARD_ENCODE_TABLE) { buffer[pos++] = PAD; } break; } if (lineLength > 0 && pos > 0) { System.arraycopy(lineSeparator, 0, buffer, pos, lineSeparator.length); pos += lineSeparator.length; } } else { for (int i = 0; i < inAvail; i++) { if (buffer == null || buffer.length - pos < encodeSize) { resizeBuffer(); } modulus = ++modulus % 3; int b = in[inPos++]; if (b < 0) { b += 256; } x = (x << 8) + b; if (0 == modulus) { buffer[pos++] = encodeTable[x >> 18 & MASK_6BITS]; buffer[pos++] = encodeTable[x >> 12 & MASK_6BITS]; buffer[pos++] = encodeTable[x >> 6 & MASK_6BITS]; buffer[pos++] = encodeTable[x & MASK_6BITS]; currentLinePos += 4; if (lineLength > 0 && lineLength <= currentLinePos) { System.arraycopy(lineSeparator, 0, buffer, pos, lineSeparator.length); pos += lineSeparator.length; currentLinePos = 0; } } } } } /** * <p> * Decodes all of the provided data, starting at inPos, for inAvail bytes. * Should be called at least twice: once with the data to decode, and once * with inAvail set to "-1" to alert decoder that EOF has been reached. The * "-1" call is not necessary when decoding, but it doesn't hurt, either. * </p> * <p> * Ignores all non-base64 characters. This is how chunked (e.g. 76 * character) data is handled, since CR and LF are silently ignored, but has * implications for other bytes, too. This method subscribes to the * garbage-in, garbage-out philosophy: it will not check the provided data * for validity. * </p> * <p> * Thanks to "commons" project in ws.apache.org for the bitwise operations, * and general approach. * http://svn.apache.org/repos/asf/webservices/commons/trunk/modules/util/ * </p> * * @param in * byte[] array of ascii data to base64 decode. * @param inPos * Position to start reading data from. * @param inAvail * Amount of bytes available from input for encoding. */ void decode(byte[] in, int inPos, int inAvail) { if (eof) { return; } if (inAvail < 0) { eof = true; } for (int i = 0; i < inAvail; i++) { if (buffer == null || buffer.length - pos < decodeSize) { resizeBuffer(); } byte b = in[inPos++]; if (b == PAD) { // We're done. eof = true; break; } else { if (b >= 0 && b < DECODE_TABLE.length) { int result = DECODE_TABLE[b]; if (result >= 0) { modulus = ++modulus % 4; x = (x << 6) + result; if (modulus == 0) { buffer[pos++] = (byte) (x >> 16 & MASK_8BITS); buffer[pos++] = (byte) (x >> 8 & MASK_8BITS); buffer[pos++] = (byte) (x & MASK_8BITS); } } } } } // Two forms of EOF as far as base64 decoder is concerned: actual // EOF (-1) and first time '=' character is encountered in stream. // This approach makes the '=' padding characters completely optional. if (eof && modulus != 0) { x = x << 6; switch (modulus) { case 2: x = x << 6; buffer[pos++] = (byte) (x >> 16 & MASK_8BITS); break; case 3: buffer[pos++] = (byte) (x >> 16 & MASK_8BITS); buffer[pos++] = (byte) (x >> 8 & MASK_8BITS); break; } } } /** * Returns whether or not the <code>octet</code> is in the base 64 alphabet. * * @param octet * The value to test * @return <code>true</code> if the value is defined in the the base 64 * alphabet, <code>false</code> otherwise. * @since 1.4 */ public static boolean isBase64(byte octet) { return octet == PAD || octet >= 0 && octet < DECODE_TABLE.length && DECODE_TABLE[octet] != -1; } /** * Tests a given byte array to see if it contains only valid characters * within the Base64 alphabet. Currently the method treats whitespace as * valid. * * @param arrayOctet * byte array to test * @return <code>true</code> if all bytes are valid characters in the Base64 * alphabet or if the byte array is empty; false, otherwise */ public static boolean isArrayByteBase64(byte[] arrayOctet) { for (int i = 0; i < arrayOctet.length; i++) { if (!isBase64(arrayOctet[i]) && !isWhiteSpace(arrayOctet[i])) { return false; } } return true; } /** * Tests a given byte array to see if it contains only valid characters * within the Base64 alphabet. * * @param arrayOctet * byte array to test * @return <code>true</code> if any byte is a valid character in the Base64 * alphabet; false herwise */ private static boolean containsBase64Byte(byte[] arrayOctet) { for (int i = 0; i < arrayOctet.length; i++) { if (isBase64(arrayOctet[i])) { return true; } } return false; } /** * Encodes binary data using the base64 algorithm but does not chunk the * output. * * @param binaryData * binary data to encode * @return byte[] containing Base64 characters in their UTF-8 * representation. */ public static byte[] encodeBase64(byte[] binaryData) { return encodeBase64(binaryData, false); } /** * Encodes binary data using the base64 algorithm into 76 character blocks * separated by CRLF. * * @param binaryData * binary data to encode * @return String containing Base64 characters. * @since 1.4 */ public static String encodeBase64String(byte[] binaryData) { return newStringUtf8(encodeBase64(binaryData, true)); } /** * Encodes binary data using a URL-safe variation of the base64 algorithm * but does not chunk the output. The url-safe variation emits - and _ * instead of + and / characters. * * @param binaryData * binary data to encode * @return byte[] containing Base64 characters in their UTF-8 * representation. * @since 1.4 */ public static byte[] encodeBase64URLSafe(byte[] binaryData) { return encodeBase64(binaryData, false, true); } /** * Encodes binary data using a URL-safe variation of the base64 algorithm * but does not chunk the output. The url-safe variation emits - and _ * instead of + and / characters. * * @param binaryData * binary data to encode * @return String containing Base64 characters * @since 1.4 */ public static String encodeBase64URLSafeString(byte[] binaryData) { return newStringUtf8(encodeBase64(binaryData, false, true)); } /** * Encodes binary data using the base64 algorithm and chunks the encoded * output into 76 character blocks * * @param binaryData * binary data to encode * @return Base64 characters chunked in 76 character blocks */ public static byte[] encodeBase64Chunked(byte[] binaryData) { return encodeBase64(binaryData, true); } /** * Decodes an Object using the base64 algorithm. This method is provided in * order to satisfy the requirements of the Decoder interface, and will * throw a DecoderException if the supplied object is not of type byte[] or * String. * * @param pObject * Object to decode * @return An object (of type byte[]) containing the binary data which * corresponds to the byte[] or String supplied. * @throws IllegalArgumentException * if the parameter supplied is not of type byte[] */ public Object decode(Object pObject) throws IllegalArgumentException { if (pObject instanceof byte[]) { return decode((byte[]) pObject); } else if (pObject instanceof String) { return decode((String) pObject); } else { throw new IllegalArgumentException( "Parameter supplied to Base64 decode is not a byte[] or a String"); } } /** * Decodes a String containing containing characters in the Base64 alphabet. * * @param pArray * A String containing Base64 character data * @return a byte array containing binary data * @since 1.4 */ public byte[] decode(String pArray) { return decode(getBytesUtf8(pArray)); } private byte[] getBytesUtf8(String text) { if (text == null) { return null; } try { return text.getBytes("UTF-8"); } catch (UnsupportedEncodingException e) { return null; } } /** * Decodes a byte[] containing containing characters in the Base64 alphabet. * * @param pArray * A byte array containing Base64 character data * @return a byte array containing binary data */ public byte[] decode(byte[] pArray) { reset(); if (pArray == null || pArray.length == 0) { return pArray; } long len = pArray.length * 3 / 4; byte[] buf = new byte[(int) len]; setInitialBuffer(buf, 0, buf.length); decode(pArray, 0, pArray.length); decode(pArray, 0, -1); // Notify decoder of EOF. // Would be nice to just return buf (like we sometimes do in the encode // logic), but we have no idea what the line-length was (could even be // variable). So we cannot determine ahead of time exactly how big an // array is necessary. Hence the need to construct a 2nd byte array to // hold the final result: byte[] result = new byte[pos]; readResults(result, 0, result.length); return result; } /** * Encodes binary data using the base64 algorithm, optionally chunking the * output into 76 character blocks. * * @param binaryData * Array containing binary data to encode. * @param isChunked * if <code>true</code> this encoder will chunk the base64 output * into 76 character blocks * @return Base64-encoded data. * @throws IllegalArgumentException * Thrown when the input array needs an output array bigger than * {@link Integer#MAX_VALUE} */ public static byte[] encodeBase64(byte[] binaryData, boolean isChunked) { return encodeBase64(binaryData, isChunked, false); } /** * Encodes binary data using the base64 algorithm, optionally chunking the * output into 76 character blocks. * * @param binaryData * Array containing binary data to encode. * @param isChunked * if <code>true</code> this encoder will chunk the base64 output * into 76 character blocks * @param urlSafe * if <code>true</code> this encoder will emit - and _ instead of * the usual + and / characters. * @return Base64-encoded data. * @throws IllegalArgumentException * Thrown when the input array needs an output array bigger than * {@link Integer#MAX_VALUE} * @since 1.4 */ public static byte[] encodeBase64(byte[] binaryData, boolean isChunked, boolean urlSafe) { return encodeBase64(binaryData, isChunked, urlSafe, Integer.MAX_VALUE); } /** * Encodes binary data using the base64 algorithm, optionally chunking the * output into 76 character blocks. * * @param binaryData * Array containing binary data to encode. * @param isChunked * if <code>true</code> this encoder will chunk the base64 output * into 76 character blocks * @param urlSafe * if <code>true</code> this encoder will emit - and _ instead of * the usual + and / characters. * @param maxResultSize * The maximum result size to accept. * @return Base64-encoded data. * @throws IllegalArgumentException * Thrown when the input array needs an output array bigger than * maxResultSize * @since 1.4 */ public static byte[] encodeBase64(byte[] binaryData, boolean isChunked, boolean urlSafe, int maxResultSize) { if (binaryData == null || binaryData.length == 0) { return binaryData; } long len = getEncodeLength(binaryData, CHUNK_SIZE, CHUNK_SEPARATOR); if (len > maxResultSize) { throw new IllegalArgumentException( "Input array too big, the output array would be bigger (" + len + ") than the specified maxium size of " + maxResultSize); } Base64 b64 = isChunked ? new Base64(urlSafe) : new Base64(0, CHUNK_SEPARATOR, urlSafe); return b64.encode(binaryData); } /** * Decodes a Base64 String into octets * * @param base64String * String containing Base64 data * @return Array containing decoded data. * @since 1.4 */ public static byte[] decodeBase64(String base64String) { return new Base64().decode(base64String); } /** * Decodes Base64 data into octets * * @param base64Data * Byte array containing Base64 data * @return Array containing decoded data. */ public static byte[] decodeBase64(byte[] base64Data) { return new Base64().decode(base64Data); } /** * Discards any whitespace from a base-64 encoded block. * * @param data * The base-64 encoded data to discard the whitespace from. * @return The data, less whitespace (see RFC 2045). * @deprecated This method is no longer needed */ @Deprecated static byte[] discardWhitespace(byte[] data) { byte groomedData[] = new byte[data.length]; int bytesCopied = 0; for (int i = 0; i < data.length; i++) { switch (data[i]) { case ' ': case '\n': case '\r': case '\t': break; default: groomedData[bytesCopied++] = data[i]; } } byte packedData[] = new byte[bytesCopied]; System.arraycopy(groomedData, 0, packedData, 0, bytesCopied); return packedData; } /** * Checks if a byte value is whitespace or not. * * @param byteToCheck * the byte to check * @return true if byte is whitespace, false otherwise */ private static boolean isWhiteSpace(byte byteToCheck) { switch (byteToCheck) { case ' ': case '\n': case '\r': case '\t': return true; default: return false; } } // Implementation of the Encoder Interface /** * Encodes an Object using the base64 algorithm. This method is provided in * order to satisfy the requirements of the Encoder interface, and will * throw an EncoderException if the supplied object is not of type byte[]. * * @param pObject * Object to encode * @return An object (of type byte[]) containing the base64 encoded data * which corresponds to the byte[] supplied. * @throws IllegalArgumentException * if the parameter supplied is not of type byte[] */ public Object encode(Object pObject) throws IllegalArgumentException { if (!(pObject instanceof byte[])) { throw new IllegalArgumentException( "Parameter supplied to Base64 encode is not a byte[]"); } return encode((byte[]) pObject); } /** * Encodes a byte[] containing binary data, into a String containing * characters in the Base64 alphabet. * * @param pArray * a byte array containing binary data * @return A String containing only Base64 character data * @since 1.4 */ public String encodeToString(byte[] pArray) { return newStringUtf8(encode(pArray)); } /** * Encodes a byte[] containing binary data, into a byte[] containing * characters in the Base64 alphabet. * * @param pArray * a byte array containing binary data * @return A byte array containing only Base64 character data */ public byte[] encode(byte[] pArray) { reset(); if (pArray == null || pArray.length == 0) { return pArray; } long len = getEncodeLength(pArray, lineLength, lineSeparator); byte[] buf = new byte[(int) len]; setInitialBuffer(buf, 0, buf.length); encode(pArray, 0, pArray.length); encode(pArray, 0, -1); // Notify encoder of EOF. // Encoder might have resized, even though it was unnecessary. if (buffer != buf) { readResults(buf, 0, buf.length); } // In URL-SAFE mode we skip the padding characters, so sometimes our // final length is a bit smaller. if (isUrlSafe() && pos < buf.length) { byte[] smallerBuf = new byte[pos]; System.arraycopy(buf, 0, smallerBuf, 0, pos); buf = smallerBuf; } return buf; } /** * Pre-calculates the amount of space needed to base64-encode the supplied * array. * * @param pArray * byte[] array which will later be encoded * @param chunkSize * line-length of the output (<= 0 means no chunking) between * each chunkSeparator (e.g. CRLF). * @param chunkSeparator * the sequence of bytes used to separate chunks of output (e.g. * CRLF). * * @return amount of space needed to encoded the supplied array. Returns a * long since a max-len array will require Integer.MAX_VALUE + 33%. */ private static long getEncodeLength(byte[] pArray, int chunkSize, byte[] chunkSeparator) { // base64 always encodes to multiples of 4. chunkSize = chunkSize / 4 * 4; long len = pArray.length * 4 / 3; long mod = len % 4; if (mod != 0) { len += 4 - mod; } if (chunkSize > 0) { boolean lenChunksPerfectly = len % chunkSize == 0; len += len / chunkSize * chunkSeparator.length; if (!lenChunksPerfectly) { len += chunkSeparator.length; } } return len; } // Implementation of integer encoding used for crypto /** * Decodes a byte64-encoded integer according to crypto standards such as * W3C's XML-Signature * * @param pArray * a byte array containing base64 character data * @return A BigInteger * @since 1.4 */ public static BigInteger decodeInteger(byte[] pArray) { return new BigInteger(1, decodeBase64(pArray)); } /** * Encodes to a byte64-encoded integer according to crypto standards such as * W3C's XML-Signature * * @param bigInt * a BigInteger * @return A byte array containing base64 character data * @throws NullPointerException * if null is passed in * @since 1.4 */ public static byte[] encodeInteger(BigInteger bigInt) { if (bigInt == null) { throw new NullPointerException( "encodeInteger called with null parameter"); } return encodeBase64(toIntegerBytes(bigInt), false); } /** * Returns a byte-array representation of a <code>BigInteger</code> without * sign bit. * * @param bigInt * <code>BigInteger</code> to be converted * @return a byte array representation of the BigInteger parameter */ static byte[] toIntegerBytes(BigInteger bigInt) { int bitlen = bigInt.bitLength(); // round bitlen bitlen = bitlen + 7 >> 3 << 3; byte[] bigBytes = bigInt.toByteArray(); if (bigInt.bitLength() % 8 != 0 && bigInt.bitLength() / 8 + 1 == bitlen / 8) { return bigBytes; } // set up params for copying everything but sign bit int startSrc = 0; int len = bigBytes.length; // if bigInt is exactly byte-aligned, just skip signbit in copy if (bigInt.bitLength() % 8 == 0) { startSrc = 1; len--; } int startDst = bitlen / 8 - len; // to pad w/ nulls as per spec byte[] resizedBytes = new byte[bitlen / 8]; System.arraycopy(bigBytes, startSrc, resizedBytes, startDst, len); return resizedBytes; } /** * Resets this Base64 object to its initial newly constructed state. */ private void reset() { buffer = null; pos = 0; readPos = 0; currentLinePos = 0; modulus = 0; eof = false; } }
发表评论
-
公约数,公倍数和素数的简单计算
2012-04-01 16:08 1333为自己留作备份,省得用到的时候再去寻找 简单的计算最大公约数 ... -
java简单打印
2012-03-08 09:56 1234没什么,就是一个简单的打印,留作存档 publi ... -
httpclient4的封装
2012-01-06 15:11 4636没什么特别的,自己封装着用的. package cpcns. ... -
h2的baseDir
2011-11-11 16:38 1464使用h2 1.3.161.在web项目中.计划在Listene ... -
eclipse下自动打包项目并部署到web项目的lib下
2011-10-18 15:59 5119修改web项目的.settings下的org.eclipse. ... -
获取汉字的五笔,全拼和双拼的工具类
2011-10-10 15:51 2395如题,项目需要,首先可用的自然是pinyin4j. 在不考虑 ... -
五笔86和汉字对照表
2011-10-09 16:53 2536项目要用到汉字转拼音和五笔,拼音容易,使用pinyin4j. ... -
java System属性
2011-09-19 10:14 1388自定义 : java -Dname=value S ... -
log4j日志文件的相对路径
2011-09-01 10:51 6814一直没能很好的解决log4j的日志文件的保存路径.今天恰好又遇 ... -
来,让我们一起画个印章吧
2011-07-04 14:52 4533这几天发现有哥们在介 ... -
svg中的arc转化为java中的arc
2011-05-27 15:31 2682最近项目需要解析svg中的path.直线和贝塞尔曲线都好办,唯 ... -
swing的拖拽(dnd)的简单实现
2011-03-28 10:18 2011这几天项目需要用到dnd,API比较麻烦.在网上找了很多,都只 ... -
自用的MD5计算工具
2011-03-11 15:45 1786/** * 检查输入流的MD5值是否符合.如果MD5为 ... -
用jsoup分析下载巨鲸的mp3
2011-02-25 15:37 1729这两天突然想听听杰克逊的歌.首选当然是巨鲸. 支持正版. ... -
获取子类的泛型参数
2011-01-27 16:03 1363用的时候不好找,今天看nutz的dao的源码看到了,摘出来备份 ... -
简单的通过注解运行的dao
2011-01-26 11:47 1796项目是个老项目,是个比较简单,但是编码比较凌乱的项目.数据库字 ... -
java模拟js的escape和unescape函数
2011-01-05 10:43 3470这个是在网上找的代码,然后修改了下.作用标题已经很明显了. ... -
自己写的多线程对象池
2010-12-10 16:53 1325/** * 排版器的一个公用接口 <br> ... -
apache poi读取excel中的颜色,真是坑爹啊
2010-12-01 16:23 16977工作原因,需要使用poi来读取excel中的所有内容. 其他 ... -
查找项目中实现接口的所有类
2010-11-15 13:45 5905最近为项目写了一个公式执行功能,其中函数太多,只能写了一个接口 ...
相关推荐
Apache Commons Codec库与Java中的BASE64编码与解码 Apache Commons Codec是一个开源项目,它提供了各种编码和解码算法的实现,包括但不限于ASCII、URL、Unicode、HEX以及我们在此关注的BASE64编码。在给定的压缩包...
综上所述,Apache Commons Codec 1.10提供的Base64支持是一个强大且灵活的工具,它允许开发人员在Java环境中方便地进行Base64编码和解码操作,同时还提供了处理其他编码格式的可能性。通过这些类和接口,我们可以...
接下来,可以使用Apache Commons Codec提供的`Base64`类来进行Base64的编码和解码操作。 ##### 编码示例 ```java import org.apache.commons.codec.binary.Base64; public class Base64Example { public static ...
Apache Commons Codec提供了简单易用的API,使得开发者能够在Java应用中轻松地进行Base64编码和解码。版本1.10代表了该库的第10次重大更新。这个库除了Base64,还支持其他编码格式,如Hex、URL和电报编码等。 使用...
在Java 8及以后的版本中,可以使用`Base64.Decoder.decode()`,在Apache Commons Codec库中,则是`Base64.decodeBase64()`。 总的来说,Base64编码在Java中是一个基础而重要的工具,广泛应用于网络通信、数据存储和...
Base64编码常用于在网络上传输二进制数据,而URL编码则确保了URL中的特殊字符能够正确传输。Hex编码则将字节转化为16进制表示。 2. **语音编码**:Codec库也包含了一些语音编码的实现,如波形音频(WAV)编码和解码...
总结来说,虽然JDK 1.6本身没有内置Base64支持,但通过引入Apache Commons Codec库,我们可以轻松地在JDK 1.6环境中实现Base64编码和解码。这对于需要处理Base64数据的项目至关重要,尤其是在与旧系统兼容或维护老...
在`commons-codec-1.9.jar`中,我们可以找到`org.apache.commons.codec.binary.Base64`类,该类提供了Base64的编码和解码方法。例如: - `encodeBytes(byte[])`:将字节数组编码为Base64字符串。 - `decode(String...
在Java中,处理Base64编码和解码的库通常包含在特定的包中,比如Apache Commons Codec库。这个库提供了方便的API来执行Base64的编码和解码操作。 Apache Commons Codec是Apache软件基金会的一个开源项目,提供了一...
sun.misc包下的BASE64Encoder及BASE64Decoder的sun.misc.BASE64Encoder/BASE64Decoder类。 和 org.apache.commons.codec.binary.Hex 对应的jar包
1. **解码Base64字符串**:使用Apache Commons Codec库中的`Base64`类,可以将Base64编码的字符串解码为原始的字节数组。 2. **URL编码**:将解码后的字节数组转换回字符串后,需要使用`java.net.URLEncoder.encode...
总的来说,尽管JDK 1.6没有内置Base64支持,但通过引入Apache Commons Codec或Guava库,开发者可以轻松地在旧版本的JDK中实现Base64编码和解码功能。确保正确地将库添加到项目构建路径,遵循库提供的API,即可解决...
Java中的Base64编码是一种将任意二进制数据转换为可打印ASCII字符的编码方式,广泛应用于网络传输、数据存储等领域。Base64编码的基本原理是将每3个字节(24位)的数据转化为4个6位的十六进制数字,然后用64个可打印...
在Java中,有多种库提供了Base64的编码和解码功能,包括JDK自带的API,Apache Commons Codec库,以及Bouncy Castle库。以下是对这三种实现方式的详细说明: 1. **JDK自带的Base64实现** 自Java 8开始,JDK提供了...
在Apache Commons Codec中,可以使用`org.apache.commons.codec.binary.Base64`类进行编码和解码操作。以下是导入和使用该库的基本步骤: - 添加依赖(以Maven为例): ```xml <groupId>commons-codec ...
在Java标准库中,虽然`java.util.Base64`类自Java 8开始被引入,但在一些旧版本的Java环境中,或者为了追求更小的项目体积和更高的性能,开发者可能会选择使用第三方库,如Apache Commons Codec或这个"BASE64的jar包...
解决经常遇到的The import org.apache.commons.codec cannot be resolved问题,只需导入文件中的commons-codec-1.11.jar就可以,如和导入包就不赘述了。
在本文中,我们使用Apache Commons Codec库来实现Base64编码。Apache Commons Codec库是一个功能强大且广泛使用的编码库,提供了多种编码方式,包括Base64编码。 将图片转换为Base64编码 下面是将图片转换为Base64...
import org.apache.commons.codec.binary.Base64; ``` 3. **编码**:使用`Base64`类的静态方法`encodeBytes`将字节数组编码为Base64字符串: ```java byte[] bytes = ...; // 你的原始字节数组 String encoded...
Apache Commons Codec是Java开发中常用的一个开源库,它提供了多种编码和解码功能,如Base64、Hex、Phonetic、URL、以及各种字符编码等。这个库的名字"Codec"来源于“coder-decoder”的缩写,即编码和解码器。在本文...