You can not select more than 25 topics Topics must start with a letter or number, can include dashes ('-') and can be up to 35 characters long.
 
 

132 lines
3.5 KiB

namespace com.hitrust.util.Zip.Compression
{
using System;
public class PendingBuffer
{
private int bitCount;
private uint bits;
protected byte[] buf;
private int end;
private int start;
public PendingBuffer() : this(0x1000)
{
}
public PendingBuffer(int bufsize)
{
this.buf = new byte[bufsize];
}
public void AlignToByte()
{
if (this.bitCount > 0)
{
this.buf[this.end++] = (byte) this.bits;
if (this.bitCount > 8)
{
this.buf[this.end++] = (byte) (this.bits >> 8);
}
}
this.bits = 0;
this.bitCount = 0;
}
public int Flush(byte[] output, int offset, int length)
{
if (this.bitCount >= 8)
{
this.buf[this.end++] = (byte) this.bits;
this.bits = this.bits >> 8;
this.bitCount -= 8;
}
if (length > (this.end - this.start))
{
length = this.end - this.start;
Array.Copy(this.buf, this.start, output, offset, length);
this.start = 0;
this.end = 0;
return length;
}
Array.Copy(this.buf, this.start, output, offset, length);
this.start += length;
return length;
}
public void Reset()
{
this.start = this.end = this.bitCount = 0;
}
public byte[] ToByteArray()
{
byte[] destinationArray = new byte[this.end - this.start];
Array.Copy(this.buf, this.start, destinationArray, 0, destinationArray.Length);
this.start = 0;
this.end = 0;
return destinationArray;
}
public void WriteBits(int b, int count)
{
this.bits |= (uint) (b << this.bitCount);
this.bitCount += count;
if (this.bitCount >= 0x10)
{
this.buf[this.end++] = (byte) this.bits;
this.buf[this.end++] = (byte) (this.bits >> 8);
this.bits = this.bits >> 0x10;
this.bitCount -= 0x10;
}
}
public void WriteBlock(byte[] block, int offset, int len)
{
Array.Copy(block, offset, this.buf, this.end, len);
this.end += len;
}
public void WriteByte(int b)
{
this.buf[this.end++] = (byte) b;
}
public void WriteInt(int s)
{
this.buf[this.end++] = (byte) s;
this.buf[this.end++] = (byte) (s >> 8);
this.buf[this.end++] = (byte) (s >> 0x10);
this.buf[this.end++] = (byte) (s >> 0x18);
}
public void WriteShort(int s)
{
this.buf[this.end++] = (byte) s;
this.buf[this.end++] = (byte) (s >> 8);
}
public void WriteShortMSB(int s)
{
this.buf[this.end++] = (byte) (s >> 8);
this.buf[this.end++] = (byte) s;
}
public int BitCount
{
get
{
return this.bitCount;
}
}
public bool IsFlushed
{
get
{
return (this.end == 0);
}
}
}
}