diff options
author | David Hook <dgh@cryptoworkshop.com> | 2013-05-31 11:07:45 +0400 |
---|---|---|
committer | David Hook <dgh@cryptoworkshop.com> | 2013-05-31 11:07:45 +0400 |
commit | 2b976f5364cfdbc37d3086019d93483c983eb80b (patch) | |
tree | cb846af3fd1d43f9c2562a1fb2d06b997ad8f229 /core/src/main/java/org/bouncycastle/util/encoders/BufferedEncoder.java | |
parent | 5f714bd92fbd780d22406f4bc3681be005f6f04a (diff) |
initial reshuffle
Diffstat (limited to 'core/src/main/java/org/bouncycastle/util/encoders/BufferedEncoder.java')
-rw-r--r-- | core/src/main/java/org/bouncycastle/util/encoders/BufferedEncoder.java | 96 |
1 files changed, 96 insertions, 0 deletions
diff --git a/core/src/main/java/org/bouncycastle/util/encoders/BufferedEncoder.java b/core/src/main/java/org/bouncycastle/util/encoders/BufferedEncoder.java new file mode 100644 index 00000000..107eee89 --- /dev/null +++ b/core/src/main/java/org/bouncycastle/util/encoders/BufferedEncoder.java @@ -0,0 +1,96 @@ +package org.bouncycastle.util.encoders; + + +/** + * a buffering class to allow translation from one format to another to + * be done in discrete chunks. + */ +public class BufferedEncoder +{ + protected byte[] buf; + protected int bufOff; + + protected Translator translator; + + /** + * @param translator the translator to use. + * @param bufSize amount of input to buffer for each chunk. + */ + public BufferedEncoder( + Translator translator, + int bufSize) + { + this.translator = translator; + + if ((bufSize % translator.getEncodedBlockSize()) != 0) + { + throw new IllegalArgumentException("buffer size not multiple of input block size"); + } + + buf = new byte[bufSize]; + bufOff = 0; + } + + public int processByte( + byte in, + byte[] out, + int outOff) + { + int resultLen = 0; + + buf[bufOff++] = in; + + if (bufOff == buf.length) + { + resultLen = translator.encode(buf, 0, buf.length, out, outOff); + bufOff = 0; + } + + return resultLen; + } + + public int processBytes( + byte[] in, + int inOff, + int len, + byte[] out, + int outOff) + { + if (len < 0) + { + throw new IllegalArgumentException("Can't have a negative input length!"); + } + + int resultLen = 0; + int gapLen = buf.length - bufOff; + + if (len > gapLen) + { + System.arraycopy(in, inOff, buf, bufOff, gapLen); + + resultLen += translator.encode(buf, 0, buf.length, out, outOff); + + bufOff = 0; + + len -= gapLen; + inOff += gapLen; + outOff += resultLen; + + int chunkSize = len - (len % buf.length); + + resultLen += translator.encode(in, inOff, chunkSize, out, outOff); + + len -= chunkSize; + inOff += chunkSize; + } + + if (len != 0) + { + System.arraycopy(in, inOff, buf, bufOff, len); + + bufOff += len; + } + + return resultLen; + } +} |