BufferedDecoder.java
上传用户:lior1029
上传日期:2013-05-07
资源大小:209k
文件大小:2k
源码类别:

CA认证

开发平台:

Java

  1. package org.bouncycastle.util.encoders;
  2. import java.lang.IllegalStateException;
  3. /**
  4.  * a buffering class to allow translation from one format to another to
  5.  * be done in discrete chunks.
  6.  */
  7. public class BufferedDecoder
  8. {
  9. protected byte[]        buf;
  10. protected int           bufOff;
  11.     protected Translator    translator;
  12.     /**
  13.      * @param translator the translator to use.
  14.      * @param bufSize amount of input to buffer for each chunk.
  15.      */
  16. public BufferedDecoder(
  17.         Translator  translator,
  18.         int         bufSize)
  19. {
  20.         this.translator = translator;
  21.         if ((bufSize % translator.getEncodedBlockSize()) != 0)
  22.         {
  23.             throw new IllegalArgumentException("buffer size not multiple of input block size");
  24.         }
  25.         buf = new byte[bufSize];
  26.         bufOff = 0;
  27. }
  28. public int processByte(
  29.         byte        in,
  30. byte[]      out,
  31. int         outOff)
  32.     {
  33.         int         resultLen = 0;
  34.         buf[bufOff++] = in;
  35.         if (bufOff == buf.length)
  36.         {
  37.             resultLen = translator.decode(buf, 0, buf.length, out, outOff);
  38.             bufOff = 0;
  39.         }
  40.         return resultLen;
  41.     }
  42. public int processBytes(
  43. byte[]      in,
  44. int         inOff,
  45. int         len,
  46. byte[]      out,
  47. int         outOff)
  48. {
  49.         if (len < 0)
  50.         {
  51.             throw new IllegalArgumentException("Can't have a negative input length!");
  52.         }
  53. int resultLen = 0;
  54.         int gapLen = buf.length - bufOff;
  55.         if (len > gapLen)
  56.         {
  57.             System.arraycopy(in, inOff, buf, bufOff, gapLen);
  58.             resultLen += translator.decode(buf, 0, buf.length, out, outOff);
  59.             bufOff = 0;
  60.             len -= gapLen;
  61.             inOff += gapLen;
  62.             outOff += resultLen;
  63.             int chunkSize = len - (len % buf.length);
  64.             resultLen += translator.decode(in, inOff, chunkSize, out, outOff);
  65.             len -= chunkSize;
  66.             inOff += chunkSize;
  67.         }
  68.         if (len != 0)
  69.         {
  70.             System.arraycopy(in, inOff, buf, bufOff, len);
  71.             bufOff += len;
  72.         }
  73.         return resultLen;
  74. }
  75. }