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 */ /// /// Decompression application using static arithmetic coding. /// Usage: java ArithmeticDecompress InputFile OutputFile /// This decompresses files generated by the "ArithmeticCompress" application. /// public class ArithmeticDecompress { //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 ) { // Handle command line arguments if( args.Length != 2 ) { Console.Error.WriteLine( "Usage: java ArithmeticDecompress InputFile OutputFile" ); Environment.Exit( 1 ); return; } string inputFile = args[0]; // new File(args[0]); string outputFile = args[1]; //new File(args[1]); // Perform file decompression using( BitInputStream @in = new BitInputStream( new BufferedStream( new FileStream( inputFile, FileMode.Open, FileAccess.Read ) ) ) ) using( Stream @out = new BufferedStream( new FileStream( outputFile, FileMode.Create, FileAccess.Write ) ) ) { FrequencyTable freqs = readFrequencies( @in ); decompress( freqs, @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 FrequencyTable readFrequencies(BitInputStream in) throws java.io.IOException internal static FrequencyTable readFrequencies( BitInputStream @in ) { int[] freqs = new int[257]; for( int i = 0; i < 256; i++ ) { freqs[i] = readInt( @in, 32 ); } freqs[256] = 1; // EOF symbol return new SimpleFrequencyTable( freqs ); } // 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 decompress(FrequencyTable freqs, BitInputStream in, java.io.OutputStream out) throws java.io.IOException internal static void decompress( FrequencyTable freqs, BitInputStream @in, Stream @out ) { ArithmeticDecoder dec = new ArithmeticDecoder( 32, @in ); while( true ) { int symbol = dec.read( freqs ); if( symbol == 256 ) // EOF symbol { break; } @out.WriteByte( (byte)symbol ); } } // Reads an unsigned integer of the given bit width from the given stream. //JAVA TO C# CONVERTER WARNING: Method 'throws' clauses are not available in C#: //ORIGINAL LINE: private static int readInt(BitInputStream in, int numBits) throws java.io.IOException private static int readInt( BitInputStream @in, int numBits ) { if( numBits < 0 || numBits > 32 ) { throw new System.ArgumentException(); } int result = 0; for( int i = 0; i < numBits; i++ ) { result = ( result << 1 ) | @in.readNoEof(); // Big endian } return result; } }