Show / Hide Table of Contents

Class StreamManipulator

This class allows us to retrieve a specified number of bits from the input buffer, as well as copy big byte blocks.

It uses an int buffer to store up to 31 bits for direct manipulation. This guarantees that we can get at least 16 bits, but we only need at most 15, so this is all safe.

There are some optimizations in this class, for example, you must never peek more than 8 bits more than needed, and you must first peek bits before you may drop them. This is not a general purpose class but optimized for the behaviour of the Inflater.

authors of the original java version : John Leuner, Jochen Hoenicke

Inheritance
System.Object
StreamManipulator
Inherited Members
System.Object.Equals(System.Object)
System.Object.Equals(System.Object, System.Object)
System.Object.GetHashCode()
System.Object.GetType()
System.Object.MemberwiseClone()
System.Object.ReferenceEquals(System.Object, System.Object)
System.Object.ToString()
Namespace: ICSharpCode.SharpZipLib.Zip.Compression.Streams
Assembly: ICSharpCode.SharpZipLib.dll
Syntax
public class StreamManipulator

Properties

| Improve this Doc View Source

AvailableBits

Gets the number of bits available in the bit buffer. This must be only called when a previous PeekBits() returned -1.

Declaration
public int AvailableBits { get; }
Property Value
Type Description
System.Int32

the number of bits available.

| Improve this Doc View Source

AvailableBytes

Gets the number of bytes available.

Declaration
public int AvailableBytes { get; }
Property Value
Type Description
System.Int32

The number of bytes available.

| Improve this Doc View Source

IsNeedingInput

Returns true when SetInput can be called

Declaration
public bool IsNeedingInput { get; }
Property Value
Type Description
System.Boolean

Methods

| Improve this Doc View Source

CopyBytes(Byte[], Int32, Int32)

Copies bytes from input buffer to output buffer starting at output[offset]. You have to make sure, that the buffer is byte aligned. If not enough bytes are available, copies fewer bytes.

Declaration
public int CopyBytes(byte[] output, int offset, int length)
Parameters
Type Name Description
System.Byte[] output

The buffer to copy bytes to.

System.Int32 offset

The offset in the buffer at which copying starts

System.Int32 length

The length to copy, 0 is allowed.

Returns
Type Description
System.Int32

The number of bytes copied, 0 if no bytes were available.

Exceptions
Type Condition
System.ArgumentOutOfRangeException

Length is less than zero

System.InvalidOperationException

Bit buffer isnt byte aligned

| Improve this Doc View Source

DropBits(Int32)

Drops the next n bits from the input. You should have called PeekBits with a bigger or equal n before, to make sure that enough bits are in the bit buffer.

Declaration
public void DropBits(int bitCount)
Parameters
Type Name Description
System.Int32 bitCount

The number of bits to drop.

| Improve this Doc View Source

GetBits(Int32)

Gets the next n bits and increases input pointer. This is equivalent to PeekBits(Int32) followed by DropBits(Int32), except for correct error handling.

Declaration
public int GetBits(int bitCount)
Parameters
Type Name Description
System.Int32 bitCount

The number of bits to retrieve.

Returns
Type Description
System.Int32

the value of the bits, or -1 if not enough bits available.

| Improve this Doc View Source

PeekBits(Int32)

Get the next sequence of bits but don't increase input pointer. bitCount must be less or equal 16 and if this call succeeds, you must drop at least n - 8 bits in the next call.

Declaration
public int PeekBits(int bitCount)
Parameters
Type Name Description
System.Int32 bitCount

The number of bits to peek.

Returns
Type Description
System.Int32

the value of the bits, or -1 if not enough bits available. */

| Improve this Doc View Source

Reset()

Resets state and empties internal buffers

Declaration
public void Reset()
| Improve this Doc View Source

SetInput(Byte[], Int32, Int32)

Add more input for consumption. Only call when IsNeedingInput returns true

Declaration
public void SetInput(byte[] buffer, int offset, int count)
Parameters
Type Name Description
System.Byte[] buffer

data to be input

System.Int32 offset

offset of first byte of input

System.Int32 count

number of bytes of input to add.

| Improve this Doc View Source

SkipToByteBoundary()

Skips to the next byte boundary.

Declaration
public void SkipToByteBoundary()
| Improve this Doc View Source

TryGetBits(Int32, ref Byte[], Int32)

Tries to grab the next bitCount bits from the input and sets index of array to the value.

Declaration
public bool TryGetBits(int bitCount, ref byte[] array, int index)
Parameters
Type Name Description
System.Int32 bitCount
System.Byte[] array
System.Int32 index
Returns
Type Description
System.Boolean

true if enough bits could be read, otherwise false

| Improve this Doc View Source

TryGetBits(Int32, ref Int32, Int32)

Tries to grab the next bitCount bits from the input and sets output to the value, adding outputOffset.

Declaration
public bool TryGetBits(int bitCount, ref int output, int outputOffset = 0)
Parameters
Type Name Description
System.Int32 bitCount
System.Int32 output
System.Int32 outputOffset
Returns
Type Description
System.Boolean

true if enough bits could be read, otherwise false

  • Improve this Doc
  • View Source
In This Article
Back to top Copyright © 2000-2022 SharpZipLib Contributors