/// <summary>
 /// Decode security footer
 /// </summary>
 /// <param name="decoder"></param>
 private void DecodeSecurityFooter(BinaryDecoder decoder)
 {
     if ((SecurityFlags & SecurityFlagsEncodingMask.SecurityFooter) != 0)
     {
         SecurityFooter = decoder.ReadByteArray("SecurityFooter").ToArray();
     }
 }
        /// <summary>
        /// Decode security header
        /// </summary>
        /// <param name="decoder"></param>
        private void DecodeSecurityHeader(BinaryDecoder decoder)
        {
            if ((ExtendedFlags1 & ExtendedFlags1EncodingMask.Security) != 0)
            {
                SecurityFlags = (SecurityFlagsEncodingMask)decoder.ReadByte("SecurityFlags");

                SecurityTokenId = decoder.ReadUInt32("SecurityTokenId");
                NonceLength     = decoder.ReadByte("NonceLength");
                MessageNonce    = decoder.ReadByteArray("MessageNonce").ToArray();

                if ((SecurityFlags & SecurityFlagsEncodingMask.SecurityFooter) != 0)
                {
                    SecurityFooterSize = decoder.ReadUInt16("SecurityFooterSize");
                }
            }
        }
        /// <summary>
        /// Decode an array type according to dimensions constraints specified in 6.2.2.1.3 FieldMetaData
        /// </summary>
        /// <param name="binaryDecoder"></param>
        /// <param name="builtInType"></param>
        /// <returns></returns>
        private object DecodeRawArrayOneDimension(BinaryDecoder binaryDecoder, BuiltInType builtInType)
        {
            switch ((BuiltInType)builtInType)
            {
            case BuiltInType.Boolean:
                return(binaryDecoder.ReadBooleanArray(null));

            case BuiltInType.SByte:
                return(binaryDecoder.ReadSByteArray(null));

            case BuiltInType.Byte:
                return(binaryDecoder.ReadByteArray(null));

            case BuiltInType.Int16:
                return(binaryDecoder.ReadInt16Array(null));

            case BuiltInType.UInt16:
                return(binaryDecoder.ReadUInt16Array(null));

            case BuiltInType.Int32:
                return(binaryDecoder.ReadInt32Array(null));

            case BuiltInType.UInt32:
                return(binaryDecoder.ReadUInt32Array(null));

            case BuiltInType.Int64:
                return(binaryDecoder.ReadInt64Array(null));

            case BuiltInType.UInt64:
                return(binaryDecoder.ReadUInt64Array(null));

            case BuiltInType.Float:
                return(binaryDecoder.ReadFloatArray(null));

            case BuiltInType.Double:
                return(binaryDecoder.ReadDoubleArray(null));

            case BuiltInType.String:
                return(binaryDecoder.ReadStringArray(null));

            case BuiltInType.DateTime:
                return(binaryDecoder.ReadDateTimeArray(null));

            case BuiltInType.Guid:
                return(binaryDecoder.ReadGuidArray(null));

            case BuiltInType.ByteString:
                return(binaryDecoder.ReadByteStringArray(null));

            case BuiltInType.XmlElement:
                return(binaryDecoder.ReadXmlElementArray(null));

            case BuiltInType.NodeId:
                return(binaryDecoder.ReadNodeIdArray(null));

            case BuiltInType.ExpandedNodeId:
                return(binaryDecoder.ReadExpandedNodeIdArray(null));

            case BuiltInType.StatusCode:
                return(binaryDecoder.ReadStatusCodeArray(null));

            case BuiltInType.QualifiedName:
                return(binaryDecoder.ReadQualifiedNameArray(null));

            case BuiltInType.LocalizedText:
                return(binaryDecoder.ReadLocalizedTextArray(null));

            case BuiltInType.DataValue:
                return(binaryDecoder.ReadDataValueArray(null));

            case BuiltInType.Enumeration:
                //return binaryDecoder.ReadInt32Array(null);
                //return binaryDecoder.ReadEnumeratedArray(null, typeof(Int32));
                return(binaryDecoder.ReadVariantArray(null));

            case BuiltInType.Variant:
                return(binaryDecoder.ReadVariantArray(null));

            case BuiltInType.ExtensionObject:
                return(binaryDecoder.ReadExtensionObjectArray(null));

            default:
                return(null);
            }
        }