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 */ /// /// A stream where bits can be written to. Because they are written to an underlying /// byte stream, the end of the stream is padded with 0's up to a multiple of 8 bits. /// The bits are written in big endian. Mutable and not thread-safe. /// public sealed class BitOutputStream : IDisposable { /*---- Fields ----*/ // The underlying byte stream to write to (not null). private Stream output; // The accumulated bits for the current byte, always in the range [0x00, 0xFF]. private int currentByte; // Number of accumulated bits in the current byte, always between 0 and 7 (inclusive). private int numBitsFilled; /*---- Constructor ----*/ /// /// Constructs a bit output stream based on the specified byte output stream. /// the byte output stream /// if the output stream is {@code null} public BitOutputStream( Stream @out ) { output = @out; //Objects.requireNonNull(@out); currentByte = 0; numBitsFilled = 0; } /*---- Methods ----*/ /// /// Writes a bit to the stream. The specified bit must be 0 or 1. /// the bit to write, which must be 0 or 1 /// if an I/O exception occurred //JAVA TO C# CONVERTER WARNING: Method 'throws' clauses are not available in C#: //ORIGINAL LINE: public void write(int b) throws java.io.IOException public void write( int b ) { if( b != 0 && b != 1 ) { throw new System.ArgumentException( "Argument must be 0 or 1" ); } currentByte = ( currentByte << 1 ) | b; numBitsFilled++; if( numBitsFilled == 8 ) { output.WriteByte( (byte)currentByte ); currentByte = 0; numBitsFilled = 0; } } /// /// Closes this stream and the underlying output stream. If called when this /// bit stream is not at a byte boundary, then the minimum number of "0" bits /// (between 0 and 7 of them) are written as padding to reach the next byte boundary. /// if an I/O exception occurred //JAVA TO C# CONVERTER WARNING: Method 'throws' clauses are not available in C#: //ORIGINAL LINE: public void close() throws java.io.IOException public void close() { while( numBitsFilled != 0 ) { write( 0 ); } output.Close(); } public void Dispose() { throw new NotImplementedException(); } }