|
UNRLE |
|
import java.io.*; /** * UNRLE.java<P> * * Ported to Java by Tim Tyler, July 2001 - http://mandala.co.uk/birle/<P> * Slight modifications were made during the port. * * Modifeid by David A. Scott * see comment there for info. * As always if you choose to use this your on you own. * * Original code: * Mark Nelson<BR> * March 8, 1996<BR> * http://web2.airmail.net/markn<BR> * */ public class UNRLE { final static boolean report_times = true; final static boolean report_size = true; FileOutputStream out = null; FileInputStream in = null; byte[] array = new byte[1]; void putc(int i) throws IOException { out.write((byte)i); } int getc() throws IOException { int rb; if ((rb = in.read(array, 0, 1)) == -1) {/* Read the next character. */ return -1; // EOF flag... } return array[0] & 0xff; } /** * Decompresses input_file and stores the results in output_file */ public void decompress(String input_file, String output_file) throws IOException { long start_time; if (report_times) { start_time = System.currentTimeMillis(); } try { in = new FileInputStream(input_file); out = new FileOutputStream(output_file); int last = -1; // see notes in RLE.java int lastbo = -2; // see notes in RLE.java int c; int count; while ((c = getc()) >= 0) { putc(c); if (lastbo == last) { if (c == last) { count = getc(); if (count < 0) { break; /* EOF specail end */ } while ((c = getc()) == last) { count += 256; } if (c < 0) { count += (count % 256) == 0 ? 256: 0; } while (count-- > 0) { putc(last); } if (c < 0) { break; /* more EOF processing */ } putc(c); } } lastbo = last; last = c; } in.close(); out.close(); } catch(Exception e) { printf("\nError while processing file:"); e.printStackTrace(); } if (report_times) { start_time = System.currentTimeMillis() - start_time; printf("Time taken:" + ((start_time / 10) / 100F) + " seconds."); } if (report_size) { File f1 = new File(input_file); printf("Original file size: " + f1.length() + " bytes."); File f2 = new File(output_file); printf("Compressed file size: " + f2.length() + " bytes."); } } static void printf(String s) { System.out.println(s); } /** * Handles the Commmand-line interface to the compressor */ public static void main(String[] args) throws IOException { UNRLE da = new UNRLE(); String input_file = null; String output_file = null; printf("Bijective RLE decompressor version of July 12, 2001."); // printf("Arithmetic decoding from "); if (args.length > 0) { input_file = args[0]; printf("Compressed file: " + args[0]); } else { printf("Error: No input file specified"); System.exit(0); } if (args.length > 1) { output_file = args[1]; printf("Decompressed file: " + args[1]); } else { printf("Error: No output file specified"); System.exit(0); } da.decompress(input_file, output_file); } }
|
UNRLE |
|