Code:
/ 4.0 / 4.0 / untmp / DEVDIV_TFS / Dev10 / Releases / RTMRel / ndp / fx / src / Xml / System / Xml / BinHexDecoder.cs / 1305376 / BinHexDecoder.cs
//------------------------------------------------------------------------------ //// Copyright (c) Microsoft Corporation. All rights reserved. // //[....] //----------------------------------------------------------------------------- using System; using System.Diagnostics; namespace System.Xml { internal class BinHexDecoder : IncrementalReadDecoder { // // Fields // byte[] buffer; int startIndex; int curIndex; int endIndex; bool hasHalfByteCached; byte cachedHalfByte; // // IncrementalReadDecoder interface // internal override int DecodedCount { get { return curIndex - startIndex; } } internal override bool IsFull { get { return curIndex == endIndex; } } #if SILVERLIGHT && !SILVERLIGHT_DISABLE_SECURITY [System.Security.SecuritySafeCritical] #endif internal override unsafe int Decode(char[] chars, int startPos, int len) { if ( chars == null ) { throw new ArgumentNullException( "chars" ); } if ( len < 0 ) { throw new ArgumentOutOfRangeException( "len" ); } if ( startPos < 0 ) { throw new ArgumentOutOfRangeException( "startPos" ); } if ( chars.Length - startPos < len ) { throw new ArgumentOutOfRangeException( "len" ); } if ( len == 0 ) { return 0; } int bytesDecoded, charsDecoded; fixed ( char* pChars = &chars[startPos] ) { fixed ( byte* pBytes = &buffer[curIndex] ) { Decode( pChars, pChars + len, pBytes, pBytes + ( endIndex - curIndex ), ref this.hasHalfByteCached, ref this.cachedHalfByte, out charsDecoded, out bytesDecoded ); } } curIndex += bytesDecoded; return charsDecoded; } #if SILVERLIGHT && !SILVERLIGHT_DISABLE_SECURITY [System.Security.SecuritySafeCritical] #endif internal override unsafe int Decode(string str, int startPos, int len) { if ( str == null ) { throw new ArgumentNullException( "str" ); } if ( len < 0 ) { throw new ArgumentOutOfRangeException( "len" ); } if ( startPos < 0 ) { throw new ArgumentOutOfRangeException( "startPos" ); } if ( str.Length - startPos < len ) { throw new ArgumentOutOfRangeException( "len" ); } if ( len == 0 ) { return 0; } int bytesDecoded, charsDecoded; fixed ( char* pChars = str ) { fixed ( byte* pBytes = &buffer[curIndex] ) { Decode( pChars + startPos, pChars + startPos + len, pBytes, pBytes + ( endIndex - curIndex ), ref this.hasHalfByteCached, ref this.cachedHalfByte, out charsDecoded, out bytesDecoded ); } } curIndex += bytesDecoded; return charsDecoded; } internal override void Reset() { this.hasHalfByteCached = false; this.cachedHalfByte = 0; } internal override void SetNextOutputBuffer( Array buffer, int index, int count ) { Debug.Assert( buffer != null ); Debug.Assert( count >= 0 ); Debug.Assert( index >= 0 ); Debug.Assert( buffer.Length - index >= count ); Debug.Assert( ( buffer as byte[] ) != null ); this.buffer = (byte[])buffer; this.startIndex = index; this.curIndex = index; this.endIndex = index + count; } // // Static methods // #if SILVERLIGHT && !SILVERLIGHT_DISABLE_SECURITY [System.Security.SecuritySafeCritical] #endif public static unsafe byte[] Decode(char[] chars, bool allowOddChars) { if ( chars == null ) { throw new ArgumentNullException( "chars" ); } int len = chars.Length; if ( len == 0 ) { return new byte[0]; } byte[] bytes = new byte[ ( len + 1 ) / 2 ]; int bytesDecoded, charsDecoded; bool hasHalfByteCached = false; byte cachedHalfByte = 0; fixed ( char* pChars = &chars[0] ) { fixed ( byte* pBytes = &bytes[0] ) { Decode( pChars, pChars + len, pBytes, pBytes + bytes.Length, ref hasHalfByteCached, ref cachedHalfByte, out charsDecoded, out bytesDecoded ); } } if ( hasHalfByteCached && !allowOddChars ) { throw new XmlException( Res.Xml_InvalidBinHexValueOddCount, new string( chars ) ); } if ( bytesDecoded < bytes.Length ) { byte[] tmp = new byte[ bytesDecoded ]; Array.Copy( bytes, 0, tmp, 0, bytesDecoded ); bytes = tmp; } return bytes; } // // Private methods // #if SILVERLIGHT && !SILVERLIGHT_DISABLE_SECURITY [System.Security.SecurityCritical] #endif private static unsafe void Decode(char* pChars, char* pCharsEndPos, byte* pBytes, byte* pBytesEndPos, ref bool hasHalfByteCached, ref byte cachedHalfByte, out int charsDecoded, out int bytesDecoded ) { #if DEBUG Debug.Assert( pCharsEndPos - pChars >= 0 ); Debug.Assert( pBytesEndPos - pBytes >= 0 ); #endif char* pChar = pChars; byte* pByte = pBytes; XmlCharType xmlCharType = XmlCharType.Instance; while ( pChar < pCharsEndPos && pByte < pBytesEndPos ) { byte halfByte; char ch = *pChar++; if ( ch >= 'a' && ch <= 'f' ) { halfByte = (byte)(ch - 'a' + 10); } else if ( ch >= 'A' && ch <= 'F' ) { halfByte = (byte)(ch - 'A' + 10); } else if ( ch >= '0' && ch <= '9' ) { halfByte = (byte)(ch - '0'); } else if ( ( xmlCharType.charProperties[ch] & XmlCharType.fWhitespace ) != 0 ) { // else if ( xmlCharType.IsWhiteSpace( ch ) ) { continue; } else { throw new XmlException( Res.Xml_InvalidBinHexValue, new string( pChars, 0, (int)( pCharsEndPos - pChars ) ) ); } if ( hasHalfByteCached ) { *pByte++ = (byte)( ( cachedHalfByte << 4 ) + halfByte ); hasHalfByteCached = false; } else { cachedHalfByte = halfByte; hasHalfByteCached = true; } } bytesDecoded = (int)(pByte - pBytes); charsDecoded = (int)(pChar - pChars); } } } // File provided for Reference Use Only by Microsoft Corporation (c) 2007.
Link Menu
This book is available now!
Buy at Amazon US or
Buy at Amazon UK
- LocalizabilityAttribute.cs
- AuthenticationConfig.cs
- MessageEncodingBindingElementImporter.cs
- VScrollProperties.cs
- ExtensionDataObject.cs
- EncryptedType.cs
- AttachedPropertyBrowsableWhenAttributePresentAttribute.cs
- ResourceExpressionBuilder.cs
- GenericTypeParameterBuilder.cs
- ApplicationActivator.cs
- StatusBarItemAutomationPeer.cs
- ProviderSettings.cs
- AlignmentXValidation.cs
- DurableInstance.cs
- BinaryFormatterWriter.cs
- ImageKeyConverter.cs
- Matrix.cs
- Brush.cs
- ping.cs
- ColorConverter.cs
- TdsParserSessionPool.cs
- webclient.cs
- SignalGate.cs
- VectorAnimation.cs
- ListDictionaryInternal.cs
- BindingOperations.cs
- control.ime.cs
- ResponseBodyWriter.cs
- PackagePartCollection.cs
- MimeMapping.cs
- CharacterHit.cs
- SqlClientPermission.cs
- SqlSelectStatement.cs
- ResourcePool.cs
- MbpInfo.cs
- SmiMetaData.cs
- HttpConfigurationSystem.cs
- VersionedStream.cs
- ExpandoObject.cs
- CollectionType.cs
- DataObjectCopyingEventArgs.cs
- UpWmlPageAdapter.cs
- DisposableCollectionWrapper.cs
- Delegate.cs
- PropertyInformationCollection.cs
- PersonalizationStateInfo.cs
- RestHandlerFactory.cs
- Vector3DValueSerializer.cs
- ParameterCollection.cs
- PrePostDescendentsWalker.cs
- ListViewGroupConverter.cs
- TextBoxBase.cs
- LoginCancelEventArgs.cs
- FontUnitConverter.cs
- PropertyGeneratedEventArgs.cs
- WhitespaceRule.cs
- SystemDiagnosticsSection.cs
- ContentFilePart.cs
- SynchronizedInputPattern.cs
- EntityDesignerBuildProvider.cs
- MD5.cs
- CatalogPart.cs
- FormattedTextSymbols.cs
- CodeBinaryOperatorExpression.cs
- ContactManager.cs
- HtmlLink.cs
- EncryptedXml.cs
- XmlSchemaAnnotation.cs
- PanelStyle.cs
- ToolStripScrollButton.cs
- SoapParser.cs
- SecurityTokenRequirement.cs
- NamespaceList.cs
- ImageAttributes.cs
- configsystem.cs
- COM2PropertyPageUITypeConverter.cs
- WorkflowRuntimeBehavior.cs
- SqlUnionizer.cs
- XmlHierarchicalDataSourceView.cs
- DispatcherSynchronizationContext.cs
- BindingExpressionUncommonField.cs
- Helper.cs
- HtmlContainerControl.cs
- OutputWindow.cs
- NameValuePermission.cs
- Int32EqualityComparer.cs
- URLIdentityPermission.cs
- MediaElement.cs
- SiteMapNode.cs
- MissingMethodException.cs
- ToolstripProfessionalRenderer.cs
- wgx_commands.cs
- DataSetMappper.cs
- RepeaterItemEventArgs.cs
- PolicyManager.cs
- UpdatePanelTrigger.cs
- DataServiceConfiguration.cs
- XXXOnTypeBuilderInstantiation.cs
- CatalogZoneDesigner.cs
- ExpressionBinding.cs