Code:
/ 4.0 / 4.0 / DEVDIV_TFS / Dev10 / Releases / RTMRel / ndp / fx / src / Sys / System / IO / compression / OutputBuffer.cs / 1305376 / OutputBuffer.cs
namespace System.IO.Compression { using System.Diagnostics; internal class OutputBuffer { private byte[] byteBuffer; // buffer for storing bytes private int pos; // position private uint bitBuf; // store uncomplete bits private int bitCount; // number of bits in bitBuffer // set the output buffer we will be using internal void UpdateBuffer(byte[] output) { byteBuffer = output; pos = 0; } internal int BytesWritten { get { return pos; } } internal int FreeBytes { get { return byteBuffer.Length - pos; } } internal void WriteUInt16(ushort value) { Debug.Assert(FreeBytes >= 2, "No enough space in output buffer!"); byteBuffer[pos++] = (byte)value; byteBuffer[pos++] = (byte)(value >> 8); } internal void WriteBits(int n, uint bits) { Debug.Assert(n <= 16, "length must be larger than 16!"); bitBuf |= bits << bitCount; bitCount += n; if (bitCount >= 16) { Debug.Assert(byteBuffer.Length - pos >= 2, "No enough space in output buffer!"); byteBuffer[pos++] = unchecked((byte)bitBuf); byteBuffer[pos++] = unchecked((byte)(bitBuf >> 8)); bitCount -= 16; bitBuf >>= 16; } } // write the bits left in the output as bytes. internal void FlushBits() { // flush bits from bit buffer to output buffer while (bitCount >= 8) { byteBuffer[pos++] = unchecked((byte)bitBuf); bitCount -= 8; bitBuf >>= 8; } if (bitCount > 0) { byteBuffer[pos++] = unchecked((byte)bitBuf); bitBuf = 0; bitCount = 0; } } internal void WriteBytes(byte[] byteArray, int offset, int count) { Debug.Assert(FreeBytes >= count, "Not enough space in output buffer!"); // faster if (bitCount == 0) { Array.Copy(byteArray, offset, byteBuffer, pos, count); pos += count; } else { WriteBytesUnaligned(byteArray, offset, count); } } private void WriteBytesUnaligned(byte[] byteArray, int offset, int count) { for (int i = 0; i < count; i++) { byte b = byteArray[offset + i]; WriteByteUnaligned(b); } } private void WriteByteUnaligned(byte b) { WriteBits(8, b); } internal int BitsInBuffer { get { return (bitCount / 8) + 1; } } internal OutputBuffer.BufferState DumpState() { OutputBuffer.BufferState savedState; savedState.pos = pos; savedState.bitBuf = bitBuf; savedState.bitCount = bitCount; return savedState; } internal void RestoreState(OutputBuffer.BufferState state) { pos = state.pos; bitBuf = state.bitBuf; bitCount = state.bitCount; } internal struct BufferState { internal int pos; // position internal uint bitBuf; // store uncomplete bits internal int bitCount; // number of bits in bitBuffer } } } // File provided for Reference Use Only by Microsoft Corporation (c) 2007. // Copyright (c) Microsoft Corporation. All rights reserved. namespace System.IO.Compression { using System.Diagnostics; internal class OutputBuffer { private byte[] byteBuffer; // buffer for storing bytes private int pos; // position private uint bitBuf; // store uncomplete bits private int bitCount; // number of bits in bitBuffer // set the output buffer we will be using internal void UpdateBuffer(byte[] output) { byteBuffer = output; pos = 0; } internal int BytesWritten { get { return pos; } } internal int FreeBytes { get { return byteBuffer.Length - pos; } } internal void WriteUInt16(ushort value) { Debug.Assert(FreeBytes >= 2, "No enough space in output buffer!"); byteBuffer[pos++] = (byte)value; byteBuffer[pos++] = (byte)(value >> 8); } internal void WriteBits(int n, uint bits) { Debug.Assert(n <= 16, "length must be larger than 16!"); bitBuf |= bits << bitCount; bitCount += n; if (bitCount >= 16) { Debug.Assert(byteBuffer.Length - pos >= 2, "No enough space in output buffer!"); byteBuffer[pos++] = unchecked((byte)bitBuf); byteBuffer[pos++] = unchecked((byte)(bitBuf >> 8)); bitCount -= 16; bitBuf >>= 16; } } // write the bits left in the output as bytes. internal void FlushBits() { // flush bits from bit buffer to output buffer while (bitCount >= 8) { byteBuffer[pos++] = unchecked((byte)bitBuf); bitCount -= 8; bitBuf >>= 8; } if (bitCount > 0) { byteBuffer[pos++] = unchecked((byte)bitBuf); bitBuf = 0; bitCount = 0; } } internal void WriteBytes(byte[] byteArray, int offset, int count) { Debug.Assert(FreeBytes >= count, "Not enough space in output buffer!"); // faster if (bitCount == 0) { Array.Copy(byteArray, offset, byteBuffer, pos, count); pos += count; } else { WriteBytesUnaligned(byteArray, offset, count); } } private void WriteBytesUnaligned(byte[] byteArray, int offset, int count) { for (int i = 0; i < count; i++) { byte b = byteArray[offset + i]; WriteByteUnaligned(b); } } private void WriteByteUnaligned(byte b) { WriteBits(8, b); } internal int BitsInBuffer { get { return (bitCount / 8) + 1; } } internal OutputBuffer.BufferState DumpState() { OutputBuffer.BufferState savedState; savedState.pos = pos; savedState.bitBuf = bitBuf; savedState.bitCount = bitCount; return savedState; } internal void RestoreState(OutputBuffer.BufferState state) { pos = state.pos; bitBuf = state.bitBuf; bitCount = state.bitCount; } internal struct BufferState { internal int pos; // position internal uint bitBuf; // store uncomplete bits internal int bitCount; // number of bits in bitBuffer } } } // File provided for Reference Use Only by Microsoft Corporation (c) 2007. // Copyright (c) Microsoft Corporation. All rights reserved.
Link Menu

This book is available now!
Buy at Amazon US or
Buy at Amazon UK
- TransformerConfigurationWizardBase.cs
- dbdatarecord.cs
- MaterialGroup.cs
- OdbcFactory.cs
- NavigationPropertyEmitter.cs
- ExpressionConverter.cs
- Divide.cs
- UnionCodeGroup.cs
- DataServices.cs
- DataGridViewBindingCompleteEventArgs.cs
- SystemWebSectionGroup.cs
- CodePageUtils.cs
- WmfPlaceableFileHeader.cs
- userdatakeys.cs
- IList.cs
- CodePageUtils.cs
- StylusPointProperties.cs
- PathStreamGeometryContext.cs
- ReflectEventDescriptor.cs
- ConfigurationCollectionAttribute.cs
- DynamicQueryStringParameter.cs
- RelationalExpressions.cs
- XmlDomTextWriter.cs
- DelegatedStream.cs
- ListViewGroup.cs
- EndpointDiscoveryElement.cs
- DocumentReferenceCollection.cs
- ReadingWritingEntityEventArgs.cs
- SystemInfo.cs
- Byte.cs
- ToolStripItemRenderEventArgs.cs
- TextComposition.cs
- XmlIncludeAttribute.cs
- RangeValuePattern.cs
- ConstraintEnumerator.cs
- FocusWithinProperty.cs
- EventDescriptor.cs
- Events.cs
- RC2CryptoServiceProvider.cs
- DataGridViewAutoSizeColumnModeEventArgs.cs
- DefaultTraceListener.cs
- ViewBase.cs
- SqlInternalConnectionTds.cs
- Translator.cs
- WebConfigurationHost.cs
- CaseExpr.cs
- SqlParameterizer.cs
- ConfigXmlComment.cs
- InlineUIContainer.cs
- InputManager.cs
- BitmapData.cs
- PointConverter.cs
- HttpException.cs
- DtrList.cs
- DbUpdateCommandTree.cs
- GraphicsContext.cs
- Binding.cs
- ResolveNameEventArgs.cs
- AndCondition.cs
- SocketException.cs
- UnknownWrapper.cs
- XpsS0ValidatingLoader.cs
- DecoderNLS.cs
- datacache.cs
- RichTextBoxAutomationPeer.cs
- ProxyWebPart.cs
- TextEvent.cs
- ServerReliableChannelBinder.cs
- ISAPIRuntime.cs
- CodeTryCatchFinallyStatement.cs
- DictionaryBase.cs
- ExecutionContext.cs
- Delegate.cs
- DiagnosticsConfiguration.cs
- BaseDataList.cs
- TypePresenter.xaml.cs
- HtmlTernaryTree.cs
- GcSettings.cs
- Rfc2898DeriveBytes.cs
- MD5.cs
- HttpApplicationStateBase.cs
- System.Data_BID.cs
- ClonableStack.cs
- LogRestartAreaEnumerator.cs
- ClientScriptManager.cs
- InvokePatternIdentifiers.cs
- UserPersonalizationStateInfo.cs
- HostProtectionException.cs
- ImageBrush.cs
- SynchronizedMessageSource.cs
- SerializationSectionGroup.cs
- MultiView.cs
- ModelTypeConverter.cs
- SqlConnection.cs
- WebPartTracker.cs
- MachineKey.cs
- XmlSchemaExternal.cs
- StsCommunicationException.cs
- ProgressBarAutomationPeer.cs
- PipelineModuleStepContainer.cs