68 lines
2.0 KiB
C#
68 lines
2.0 KiB
C#
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
|
|
*/
|
|
|
|
|
|
|
|
/// <summary>
|
|
/// Decompression application using adaptive arithmetic coding.
|
|
/// <para>Usage: java AdaptiveArithmeticDecompress InputFile OutputFile</para>
|
|
/// <para>This decompresses files generated by the "AdaptiveArithmeticCompress" application.</para>
|
|
/// </summary>
|
|
public class AdaptiveArithmeticDecompress
|
|
{
|
|
|
|
//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 AdaptiveArithmeticDecompress InputFile OutputFile");
|
|
Environment.Exit(1);
|
|
return;
|
|
}
|
|
File inputFile = new File(args[0]);
|
|
File outputFile = new File(args[1]);
|
|
|
|
// Perform file decompression
|
|
using (BitInputStream @in = new BitInputStream(new BufferedInputStream(new FileStream(inputFile, FileMode.Open, FileAccess.Read))), Stream @out = new BufferedOutputStream(new FileStream(outputFile, FileMode.Create, FileAccess.Write)))
|
|
{
|
|
decompress(@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 decompress(BitInputStream in, java.io.OutputStream out) throws java.io.IOException
|
|
internal static void decompress(BitInputStream @in, Stream @out)
|
|
{
|
|
FlatFrequencyTable initFreqs = new FlatFrequencyTable(257);
|
|
FrequencyTable freqs = new SimpleFrequencyTable(initFreqs);
|
|
ArithmeticDecoder dec = new ArithmeticDecoder(32, @in);
|
|
while (true)
|
|
{
|
|
// Decode and write one byte
|
|
int symbol = dec.read(freqs);
|
|
if (symbol == 256) // EOF symbol
|
|
{
|
|
break;
|
|
}
|
|
@out.WriteByte((byte)symbol);
|
|
freqs.increment(symbol);
|
|
}
|
|
}
|
|
|
|
}
|