예제 #1
0
파일: Compression.java 프로젝트: hyee/JSch
  public byte[] compress(byte[] buf, int start, int[] len) {
    stream.next_in = buf;
    stream.next_in_index = start;
    stream.avail_in = len[0] - start;
    int status;
    int outputlen = start;
    byte[] outputbuf = buf;
    int tmp = 0;

    do {
      stream.next_out = tmpbuf;
      stream.next_out_index = 0;
      stream.avail_out = BUF_SIZE;
      status = stream.deflate(JZlib.Z_PARTIAL_FLUSH);
      switch (status) {
        case JZlib.Z_OK:
          tmp = BUF_SIZE - stream.avail_out;
          if (outputbuf.length < outputlen + tmp + buffer_margin) {
            byte[] foo = new byte[(outputlen + tmp + buffer_margin) * 2];
            System.arraycopy(outputbuf, 0, foo, 0, outputbuf.length);
            outputbuf = foo;
          }
          System.arraycopy(tmpbuf, 0, outputbuf, outputlen, tmp);
          outputlen += tmp;
          break;
        default:
          System.err.println("compress: deflate returnd " + status);
      }
    } while (stream.avail_out == 0);

    len[0] = outputlen;
    return outputbuf;
  }
예제 #2
0
 @Override
 public void write(byte b[], int off, int len) throws IOException {
   if (len == 0) return;
   int err;
   z.next_in = b;
   z.next_in_index = off;
   z.avail_in = len;
   do {
     z.next_out = buf;
     z.next_out_index = 0;
     z.avail_out = bufsize;
     if (compress) err = z.deflate(flush);
     else err = z.inflate(flush);
     if (err != JZlib.Z_OK)
       throw new ZStreamException((compress ? "de" : "in") + "flating: " + z.msg);
     out.write(buf, 0, bufsize - z.avail_out);
   } while (z.avail_in > 0 || z.avail_out == 0);
 }
예제 #3
0
파일: Compression.java 프로젝트: hyee/JSch
  public byte[] uncompress(byte[] buffer, int start, int[] length) {
    int inflated_end = 0;

    stream.next_in = buffer;
    stream.next_in_index = start;
    stream.avail_in = length[0];

    while (true) {
      stream.next_out = tmpbuf;
      stream.next_out_index = 0;
      stream.avail_out = BUF_SIZE;
      int status = stream.inflate(JZlib.Z_PARTIAL_FLUSH);
      switch (status) {
        case JZlib.Z_OK:
          if (inflated_buf.length < inflated_end + BUF_SIZE - stream.avail_out) {
            int len = inflated_buf.length * 2;
            if (len < inflated_end + BUF_SIZE - stream.avail_out)
              len = inflated_end + BUF_SIZE - stream.avail_out;
            byte[] foo = new byte[len];
            System.arraycopy(inflated_buf, 0, foo, 0, inflated_end);
            inflated_buf = foo;
          }
          System.arraycopy(tmpbuf, 0, inflated_buf, inflated_end, BUF_SIZE - stream.avail_out);
          inflated_end += (BUF_SIZE - stream.avail_out);
          length[0] = inflated_end;
          break;
        case JZlib.Z_BUF_ERROR:
          if (inflated_end > buffer.length - start) {
            byte[] foo = new byte[inflated_end + start];
            System.arraycopy(buffer, 0, foo, 0, start);
            System.arraycopy(inflated_buf, 0, foo, start, inflated_end);
            buffer = foo;
          } else {
            System.arraycopy(inflated_buf, 0, buffer, start, inflated_end);
          }
          length[0] = inflated_end;
          return buffer;
        default:
          System.err.println("uncompress: inflate returnd " + status);
          return null;
      }
    }
  }
예제 #4
0
  public int compress(byte[] buf, int start, int len) {
    stream.next_in = buf;
    stream.next_in_index = start;
    stream.avail_in = len - start;
    int status;
    int outputlen = start;

    do {
      stream.next_out = tmpbuf;
      stream.next_out_index = 0;
      stream.avail_out = BUF_SIZE;
      status = stream.deflate(JZlib.Z_PARTIAL_FLUSH);
      switch (status) {
        case JZlib.Z_OK:
          System.arraycopy(tmpbuf, 0, buf, outputlen, BUF_SIZE - stream.avail_out);
          outputlen += (BUF_SIZE - stream.avail_out);
          break;
        default:
          System.err.println("compress: deflate returnd " + status);
      }
    } while (stream.avail_out == 0);
    return outputlen;
  }