예제 #1
0
파일: BEREncoder.cs 프로젝트: xj0229/gsf
        public override int encodeSequence(object obj, Stream stream, ElementInfo elementInfo)
        {
            int resultSize = 0;

            PropertyInfo[] fields = elementInfo.getProperties(obj.GetType());
            for (int i = 0; i < fields.Length; i++)
            {
                PropertyInfo field = fields[fields.Length - 1 - i];
                resultSize += encodeSequenceField(obj, fields.Length - 1 - i, field, stream, elementInfo);
            }

            if (!CoderUtils.isSequenceSet(elementInfo))
            {
                resultSize += encodeHeader(
                    BERCoderUtils.getTagValueForElement(
                        elementInfo,
                        TagClasses.Universal,
                        ElementType.Constructed,
                        UniversalTags.Sequence)
                    , resultSize, stream);
            }
            else
            {
                resultSize += encodeHeader(
                    BERCoderUtils.getTagValueForElement(
                        elementInfo,
                        TagClasses.Universal,
                        ElementType.Constructed,
                        UniversalTags.Set)
                    , resultSize, stream);
            }
            return(resultSize);
        }
예제 #2
0
파일: BEREncoder.cs 프로젝트: xj0229/gsf
        public override int encodeReal(object obj, Stream stream, ElementInfo elementInfo)
        {
            int    resultSize = 0;
            Double value      = (Double)obj;
            //CoderUtils.checkConstraints(value,elementInfo);
            int szOfInt = 0;

#if PocketPC
            byte[] dblValAsBytes = System.BitConverter.GetBytes(value);
            long   asLong        = System.BitConverter.ToInt64(dblValAsBytes, 0);
#else
            long asLong = BitConverter.DoubleToInt64Bits(value);
#endif
            if (value == Double.PositiveInfinity)
            {
                // positive infinity
                stream.WriteByte(0x40); // 01000000 Value is PLUS-INFINITY
            }
            else if (value == Double.NegativeInfinity)
            {
                // negative infinity
                stream.WriteByte(0x41); // 01000001 Value is MINUS-INFINITY
            }
            else if (asLong != 0x0)
            {
                long exponent = ((0x7ff0000000000000L & asLong) >> 52) - 1023 - 52;
                long mantissa = 0x000fffffffffffffL & asLong;
                mantissa |= 0x10000000000000L; // set virtual delimiter

                // pack mantissa for base 2
                while ((mantissa & 0xFFL) == 0x0)
                {
                    mantissa >>= 8;
                    exponent  += 8; //increment exponent to 8 (base 2)
                }
                while ((mantissa & 0x01L) == 0x0)
                {
                    mantissa >>= 1;
                    exponent  += 1; //increment exponent to 1
                }

                szOfInt += encodeIntegerValue(mantissa, stream);
                int szOfExp = CoderUtils.getIntegerLength(exponent);
                szOfInt += encodeIntegerValue(exponent, stream);

                byte realPreamble = 0x80;
                realPreamble |= (byte)(szOfExp - 1);
                if (((ulong)asLong & 0x8000000000000000L) == 1)
                {
                    realPreamble |= 0x40; // Sign
                }
                stream.WriteByte(realPreamble);
                szOfInt += 1;
            }
            resultSize += szOfInt;
            resultSize += encodeLength(szOfInt, stream);
            resultSize += encodeTag(BERCoderUtils.getTagValueForElement(elementInfo, TagClasses.Universal, ElementType.Primitive, UniversalTags.Real), stream);
            return(resultSize);
        }
예제 #3
0
파일: BEREncoder.cs 프로젝트: xj0229/gsf
        public override int encodeNull(object obj, Stream stream, ElementInfo elementInfo)
        {
            stream.WriteByte((byte)0);
            int resultSize = 1;

            resultSize += encodeTag(BERCoderUtils.getTagValueForElement(elementInfo, TagClasses.Universal, ElementType.Primitive, UniversalTags.Null), stream);
            return(resultSize);
        }
예제 #4
0
        protected bool checkTagForObject(DecodedObject <object> decodedTag, int tagClass, int elementType, int universalTag, ElementInfo elementInfo)
        {
            if (decodedTag == null)
            {
                return(false);
            }
            int definedTag = BERCoderUtils.getTagValueForElement(elementInfo, tagClass, elementType, universalTag).Value;

            return(definedTag == (int)decodedTag.Value);
        }
예제 #5
0
파일: BEREncoder.cs 프로젝트: xj0229/gsf
        public override int encodeBoolean(object obj, Stream stream, ElementInfo elementInfo)
        {
            int  resultSize = 1;
            bool value      = (bool)obj;

            stream.WriteByte((byte)(value ? 0xFF : 0x00));

            resultSize += encodeLength(1, stream);
            resultSize += encodeTag(BERCoderUtils.getTagValueForElement(elementInfo, TagClasses.Universal, ElementType.Primitive, UniversalTags.Boolean), stream);
            return(resultSize);
        }
예제 #6
0
파일: BEREncoder.cs 프로젝트: xj0229/gsf
        public override int encodeEnumItem(object enumConstant, Type enumClass, Stream stream, ElementInfo elementInfo)
        {
            int          resultSize = 0;
            ASN1EnumItem enumObj    = //elementInfo.AnnotatedClass.getAnnotation(typeof(ASN1EnumItem));
                                      elementInfo.getAttribute <ASN1EnumItem>();
            int szOfInt = encodeIntegerValue(enumObj.Tag, stream);

            resultSize += szOfInt;
            resultSize += encodeLength(szOfInt, stream);
            resultSize += encodeTag(BERCoderUtils.getTagValueForElement(elementInfo, TagClasses.Universal, ElementType.Primitive, UniversalTags.Enumerated), stream);
            return(resultSize);
        }
예제 #7
0
파일: BEREncoder.cs 프로젝트: xj0229/gsf
        public override int encodeChoice(object obj, Stream stream, ElementInfo elementInfo)
        {
            int result            = 0;
            int sizeOfChoiceField = base.encodeChoice(obj, stream, elementInfo);

            if (
                (elementInfo.hasPreparedInfo() && elementInfo.hasPreparedASN1ElementInfo() && elementInfo.PreparedASN1ElementInfo.HasTag) ||
                (elementInfo.ASN1ElementInfo != null && elementInfo.ASN1ElementInfo.HasTag))
            {
                result += encodeHeader(BERCoderUtils.getTagValueForElement(elementInfo, TagClasses.ContextSpecific, ElementType.Constructed, UniversalTags.LastUniversal), sizeOfChoiceField, stream);
            }
            result += sizeOfChoiceField;
            return(result);
        }
예제 #8
0
파일: BEREncoder.cs 프로젝트: xj0229/gsf
        public override int encodeString(object obj, Stream stream, ElementInfo elementInfo)
        {
            int resultSize = 0, sizeOfString = 0;

            byte[] buffer = CoderUtils.ASN1StringToBuffer(obj, elementInfo);
            sizeOfString = buffer.Length;
            CoderUtils.checkConstraints(sizeOfString, elementInfo);

            stream.Write(buffer, 0, buffer.Length);

            resultSize += sizeOfString;
            resultSize += encodeLength(sizeOfString, stream);
            resultSize += encodeTag(BERCoderUtils.getTagValueForElement(elementInfo, TagClasses.Universal, ElementType.Primitive, CoderUtils.getStringTagForElement(elementInfo)), stream);
            return(resultSize);
        }
예제 #9
0
파일: BEREncoder.cs 프로젝트: xj0229/gsf
        public override int encodeObjectIdentifier(Object obj, Stream stream, ElementInfo elementInfo)
        {
            ObjectIdentifier oid = (ObjectIdentifier)obj;

            int[]  ia     = oid.getIntArray();
            byte[] buffer = BERObjectIdentifier.Encode(ia);
            stream.Write(buffer, 0, buffer.Length);
            int resultSize = buffer.Length;

            resultSize += encodeLength(resultSize, stream);
            resultSize += encodeTag(
                BERCoderUtils.getTagValueForElement(elementInfo, TagClasses.Universal, ElementType.Primitive, UniversalTags.ObjectIdentifier),
                stream
                );
            return(resultSize);
        }
예제 #10
0
파일: BEREncoder.cs 프로젝트: xj0229/gsf
        public override int encodeBitString(Object obj, Stream stream, ElementInfo elementInfo)
        {
            int       resultSize = 0, sizeOfString = 0;
            BitString str = (BitString)obj;

            CoderUtils.checkConstraints(str.getLengthInBits(), elementInfo);
            byte[] buffer = str.Value;
            stream.Write(buffer, 0, buffer.Length);
            stream.WriteByte((byte)str.getTrailBitsCnt());
            sizeOfString = buffer.Length + 1;

            resultSize += sizeOfString;
            resultSize += encodeLength(sizeOfString, stream);
            resultSize += encodeTag(
                BERCoderUtils.getTagValueForElement(elementInfo, TagClasses.Universal, ElementType.Primitive, UniversalTags.Bitstring),
                stream
                );
            return(resultSize);
        }
예제 #11
0
파일: BEREncoder.cs 프로젝트: xj0229/gsf
        public override int encodeInteger(object obj, Stream stream, ElementInfo elementInfo)
        {
            int resultSize = 0;
            int szOfInt    = 0;

            if (obj.GetType().Equals(typeof(int)))
            {
                int val = (int)obj;
                CoderUtils.checkConstraints(val, elementInfo);
                szOfInt = encodeIntegerValue(val, stream);
            }
            else
            {
                long val = (long)obj;
                CoderUtils.checkConstraints(val, elementInfo);
                szOfInt = encodeIntegerValue(val, stream);
            }
            resultSize += szOfInt;
            resultSize += encodeLength(szOfInt, stream);
            resultSize += encodeTag(BERCoderUtils.getTagValueForElement(elementInfo, TagClasses.Universal, ElementType.Primitive, UniversalTags.Integer), stream);
            return(resultSize);
        }
예제 #12
0
파일: BEREncoder.cs 프로젝트: xj0229/gsf
        public override int encodeSequenceOf(object obj, Stream stream, ElementInfo elementInfo)
        {
            int   resultSize = 0;
            IList collection = (IList)obj;

            CoderUtils.checkConstraints(collection.Count, elementInfo);

            int sizeOfCollection = 0;

            for (int i = 0; i < collection.Count; i++)
            {
                object      item = collection[collection.Count - 1 - i];
                ElementInfo info = new ElementInfo();
                info.AnnotatedClass       = item.GetType();
                info.ParentAnnotatedClass = elementInfo.AnnotatedClass;

                if (elementInfo.hasPreparedInfo())
                {
                    ASN1SequenceOfMetadata seqOfMeta = (ASN1SequenceOfMetadata)elementInfo.PreparedInfo.TypeMetadata;
                    info.PreparedInfo = (seqOfMeta.getItemClassMetadata());
                }

                sizeOfCollection += encodeClassType(item, stream, info);
            }
            resultSize += sizeOfCollection;
            resultSize += encodeLength(sizeOfCollection, stream);

            if (!CoderUtils.isSequenceSetOf(elementInfo))
            {
                resultSize += encodeTag(BERCoderUtils.getTagValueForElement(elementInfo, TagClasses.Universal, ElementType.Constructed, UniversalTags.Sequence), stream);
            }
            else
            {
                resultSize += encodeTag(BERCoderUtils.getTagValueForElement(elementInfo, TagClasses.Universal, ElementType.Constructed, UniversalTags.Set), stream);
            }
            return(resultSize);
        }