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
- DataGridLengthConverter.cs
- ListBoxAutomationPeer.cs
- ListViewCommandEventArgs.cs
- ReaderWriterLock.cs
- StreamGeometry.cs
- HttpsTransportBindingElement.cs
- SmtpReplyReaderFactory.cs
- ListItem.cs
- DefaultTextStore.cs
- Rect3D.cs
- BitmapDecoder.cs
- HtmlPhoneCallAdapter.cs
- Funcletizer.cs
- WindowsListViewItemStartMenu.cs
- DBDataPermissionAttribute.cs
- XmlNavigatorStack.cs
- BeginSelectCardRequest.cs
- DBCommand.cs
- IgnoreFileBuildProvider.cs
- Listbox.cs
- JsonDataContract.cs
- SafeCryptoHandles.cs
- DynamicExpression.cs
- EncodingDataItem.cs
- AsyncResult.cs
- StreamResourceInfo.cs
- LambdaCompiler.Statements.cs
- OracleConnection.cs
- DrawingGroup.cs
- TreeIterator.cs
- SecurityKeyType.cs
- ListControlDesigner.cs
- PassportIdentity.cs
- SchemaInfo.cs
- ConnectionConsumerAttribute.cs
- XmlSchemaImport.cs
- IntranetCredentialPolicy.cs
- KeyedByTypeCollection.cs
- PeerNearMe.cs
- ColumnResizeUndoUnit.cs
- AuditLog.cs
- TransactedReceiveScope.cs
- RegexCharClass.cs
- NameTable.cs
- HttpCapabilitiesBase.cs
- DataSvcMapFile.cs
- smtpconnection.cs
- ZipIOZip64EndOfCentralDirectoryLocatorBlock.cs
- CodeTypeConstructor.cs
- AnimationClock.cs
- PartitionerQueryOperator.cs
- UrlMapping.cs
- XPathQilFactory.cs
- CookieProtection.cs
- RegistryKey.cs
- NumericPagerField.cs
- Form.cs
- FlowLayout.cs
- ScrollItemProviderWrapper.cs
- HtmlHistory.cs
- Debugger.cs
- ContentWrapperAttribute.cs
- LoginView.cs
- XamlContextStack.cs
- CroppedBitmap.cs
- WebPartEditorCancelVerb.cs
- ToolTipAutomationPeer.cs
- DispatchChannelSink.cs
- SinglePhaseEnlistment.cs
- OledbConnectionStringbuilder.cs
- DynamicPropertyReader.cs
- XmlNamespaceManager.cs
- BinaryUtilClasses.cs
- StringHelper.cs
- AttributeCollection.cs
- DuplexChannel.cs
- JapaneseLunisolarCalendar.cs
- coordinatorscratchpad.cs
- SystemFonts.cs
- ListBox.cs
- PolygonHotSpot.cs
- AvtEvent.cs
- DelegatingMessage.cs
- XmlUtil.cs
- GridSplitter.cs
- DeploymentSectionCache.cs
- PhysicalFontFamily.cs
- JsonGlobals.cs
- CompiledRegexRunner.cs
- DataServiceQueryException.cs
- SharedRuntimeState.cs
- Repeater.cs
- Subset.cs
- Variable.cs
- TextServicesLoader.cs
- StickyNoteContentControl.cs
- XmlnsCompatibleWithAttribute.cs
- COM2ComponentEditor.cs
- BoolExpr.cs
- RIPEMD160Managed.cs