using System; using System.IO; /* * Reference arithmetic coding * Copyright (c) Project Nayuki * * https://www.nayuki.io/page/reference-arithmetic-coding * https://github.com/nayuki/Reference-arithmetic-coding */ /// /// Compression application using adaptive arithmetic coding. /// Usage: java AdaptiveArithmeticCompress InputFile OutputFile /// Then use the corresponding "AdaptiveArithmeticDecompress" application to recreate the original input file. /// Note that the application starts with a flat frequency table of 257 symbols (all set to a frequency of 1), /// and updates it after each byte encoded. The corresponding decompressor program also starts with a flat /// frequency table and updates it after each byte decoded. It is by design that the compressor and /// decompressor have synchronized states, so that the data can be decompressed properly. /// public class AdaptiveArithmeticCompress { //JAVA TO C# CONVERTER WARNING: Method 'throws' clauses are not available in C#: //ORIGINAL LINE: public static void main(String[] args) throws java.io.IOException public static void Main(string[] args) { /* @@@@ PORT // Handle command line arguments if (args.Length != 2) { Console.Error.WriteLine("Usage: java AdaptiveArithmeticCompress InputFile OutputFile"); Environment.Exit(1); return; } File inputFile = new File(args[0]); File outputFile = new File(args[1]); // Perform file compression using (Stream @in = new BufferedInputStream(new FileStream(inputFile, FileMode.Open, FileAccess.Read)), BitOutputStream @out = new BitOutputStream(new BufferedOutputStream(new FileStream(outputFile, FileMode.Create, FileAccess.Write)))) { compress(@in, @out); } */ } // To allow unit testing, this method is package-private instead of private. //JAVA TO C# CONVERTER WARNING: Method 'throws' clauses are not available in C#: //ORIGINAL LINE: static void compress(java.io.InputStream in, BitOutputStream out) throws java.io.IOException internal static void compress(Stream @in, BitOutputStream @out) { FlatFrequencyTable initFreqs = new FlatFrequencyTable(257); FrequencyTable freqs = new SimpleFrequencyTable(initFreqs); ArithmeticEncoder enc = new ArithmeticEncoder(32, @out); while (true) { // Read and encode one byte int symbol = @in.ReadByte(); if (symbol == -1) { break; } enc.write(freqs, symbol); freqs.increment(symbol); } enc.write(freqs, 256); // EOF enc.finish(); // Flush remaining code bits } }