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
- LocatorPart.cs
- TextDecorationCollectionConverter.cs
- SafeFileMappingHandle.cs
- TemplatedControlDesigner.cs
- EllipticalNodeOperations.cs
- EntryWrittenEventArgs.cs
- columnmapfactory.cs
- AlternateView.cs
- TimeSpan.cs
- BaseParaClient.cs
- ObjectStorage.cs
- SignatureResourcePool.cs
- GenericEnumerator.cs
- UriTemplatePathSegment.cs
- _ProxyRegBlob.cs
- SlipBehavior.cs
- ContractDescription.cs
- BinaryFormatterSinks.cs
- ValidationSummary.cs
- SqlParameterizer.cs
- CombinedGeometry.cs
- ButtonPopupAdapter.cs
- AnimationTimeline.cs
- ColumnWidthChangingEvent.cs
- JobCollate.cs
- GridProviderWrapper.cs
- Freezable.cs
- assertwrapper.cs
- RichTextBox.cs
- TextShapeableCharacters.cs
- Module.cs
- ConvertEvent.cs
- Rules.cs
- XLinq.cs
- NotSupportedException.cs
- CorrelationRequestContext.cs
- DesignerActionUIStateChangeEventArgs.cs
- CheckBox.cs
- RijndaelManagedTransform.cs
- SymLanguageType.cs
- XmlSchemaImport.cs
- Trace.cs
- TcpConnectionPool.cs
- MethodExpr.cs
- BackgroundFormatInfo.cs
- DesignerRegion.cs
- ToolStripSystemRenderer.cs
- EntityConnection.cs
- DoWorkEventArgs.cs
- TakeQueryOptionExpression.cs
- FixedStringLookup.cs
- SecurityManager.cs
- DynamicMethod.cs
- CredentialCache.cs
- listitem.cs
- _NestedSingleAsyncResult.cs
- CalendarDateChangedEventArgs.cs
- xml.cs
- SqlRemoveConstantOrderBy.cs
- ADMembershipProvider.cs
- TrustManagerMoreInformation.cs
- ResourceAttributes.cs
- DataServiceProviderWrapper.cs
- Deflater.cs
- HostedHttpTransportManager.cs
- ExpressionBuilder.cs
- EntitySqlQueryState.cs
- ButtonChrome.cs
- HttpSocketManager.cs
- CellConstantDomain.cs
- OletxEnlistment.cs
- BadImageFormatException.cs
- SessionEndingCancelEventArgs.cs
- ToolStripStatusLabel.cs
- WebBodyFormatMessageProperty.cs
- TableLayoutRowStyleCollection.cs
- ConfigurationValues.cs
- XmlDataCollection.cs
- RegistrationServices.cs
- ECDsa.cs
- ZipIOModeEnforcingStream.cs
- SqlInfoMessageEvent.cs
- SpeechUI.cs
- DragEvent.cs
- HScrollBar.cs
- SystemMulticastIPAddressInformation.cs
- Sql8ConformanceChecker.cs
- PageCatalogPart.cs
- DataGridViewRowPostPaintEventArgs.cs
- DependentList.cs
- Activator.cs
- ComponentConverter.cs
- PDBReader.cs
- Propagator.JoinPropagator.JoinPredicateVisitor.cs
- ErrorProvider.cs
- SafeIUnknown.cs
- ObjectViewFactory.cs
- _UriSyntax.cs
- ExpressionConverter.cs
- InvokeHandlers.cs