예제 #1
0
        internal static Datatype ReadMessage(
            DatatypeHeader aHeader,
            Hdf5Reader aReader,
            long?aLocalMessageSize,
            out long aBytes)
        {
            if (aHeader.Class != DatatypeClass.FixedPoint)
            {
                throw new ArgumentException(
                          $"aHeader must be for type {nameof(DatatypeClass.FixedPoint)}");
            }

            if (aLocalMessageSize.HasValue && aLocalMessageSize < mcAddionalSize)
            {
                throw new ArgumentException("Specified Local Message Size not long enough");
            }

            Flags fFlags = (Flags)aHeader.Flags;

            ByteOrdering
                fByteOrdering = fFlags.HasFlag(Flags.BigEndian)
                    ? ByteOrdering.BigEndian
                    : ByteOrdering.LittleEndian;
            byte
                fLowPad  = (byte)(fFlags.HasFlag(Flags.LowPad) ? 1 : 0),
                fHighPad = (byte)(fFlags.HasFlag(Flags.HighPad) ? 1 : 0);
            bool
                fIsSigned = fFlags.HasFlag(Flags.Signed);

            ushort
                fBitOffset    = aReader.ReadUInt16(),
                fBitPrecision = aReader.ReadUInt16();

            aBytes = mcAddionalSize;
            return(new FixedPointDataType(
                       aHeader,
                       fByteOrdering,
                       fHighPad,
                       fLowPad,
                       fIsSigned,
                       fBitOffset,
                       fBitPrecision));
        }
예제 #2
0
        internal static Message Read(
            Hdf5Reader aReader,
            long?aLocalMessageSize,
            out long aBytes)
        {
            //Read Message Headder data
            int
                fReadBytes = 4; //Always Read at least 4
            byte
                fVersion = (byte)aReader.ReadByte(),
                fFlags   = (byte)aReader.ReadByte();

            aReader.ReadUInt16(); //Reserved

            if (fVersion != mcCurrentVersion)
            {
                throw new Exceptions.UnknownMessageVersion <LinkInfo>(fVersion);
            }

            bool
                fCreationOrderTracked = ((Flags)fFlags).HasFlag(Flags.CreationOrderTracked),
                fCreationOrderIndexed = ((Flags)fFlags).HasFlag(Flags.CreationOrderIndexed);

            //Calculate Length
            if (fCreationOrderTracked)
            {
                fReadBytes += 8;
            }
            fReadBytes += 2 * (int)aReader.SizeOfOffset; //Fractal Heap address, B-Tree adress
            if (fCreationOrderIndexed)
            {
                fReadBytes += (int)aReader.SizeOfOffset;
            }
            aBytes = fReadBytes;

            if (aLocalMessageSize.HasValue && fReadBytes > aLocalMessageSize.Value)
            {
                throw new ArgumentException("Specified Local Message Size not long enough");
            }

            //Read Feilds and build the object
            LinkInfo
                fToReturn = new LinkInfo(
                fCreationOrderTracked ? aReader.ReadUInt64() : (ulong?)null,
                aReader.ReadOffset(),
                aReader.ReadOffset(),
                fCreationOrderIndexed,
                fCreationOrderIndexed ? aReader.ReadOffset() : (Offset)null);

            return(fToReturn);
        }
예제 #3
0
        public Node(Hdf5Reader aReader, Offset aLocation) : base(
                BTreeVerson.One,
                aLocation ?? aReader.Position)
        {
            aReader.VerifySignature(Signature);
            byte
                fType = (byte)aReader.ReadByte();

            if (fType > (byte)NodeType.Data)
            {
                throw new InvalidDataException($"Unexpected Node Type: {fType}");
            }
            this.NodeType     = (NodeType)fType;
            this.NodeLevel    = (byte)aReader.ReadByte();
            this.EntriesUsed  = aReader.ReadUInt16();
            this.LeftSibling  = aReader.ReadOffset();
            this.RightSibling = aReader.ReadOffset();
        }
예제 #4
0
        internal static Datatype ReadMessage(
            DatatypeHeader aHeader,
            Hdf5Reader aReader,
            long?aLocalMessageSize,
            out long aBytes)
        {
            if (aHeader.Class != DatatypeClass.FloatingPoint)
            {
                throw new ArgumentException(
                          $"aHeader must be for type {nameof(DatatypeClass.FloatingPoint)}");
            }

            if (aLocalMessageSize.HasValue && aLocalMessageSize < mcAddionalSize)
            {
                throw new ArgumentException("Specified Local Message Size not long enough");
            }

            Flags fFlags = (Flags)aHeader.Flags;

            ByteOrdering
                fByteOrdering;
            Flags
                fByteOrderFlags = Flags.ByteOrderMask & fFlags;

            switch (fByteOrderFlags)
            {
            case Flags.None:
                fByteOrdering = ByteOrdering.LittleEndian;
                break;

            case Flags.ByteOrderLow:
                fByteOrdering = ByteOrdering.BigEndian;
                break;

            case Flags.ByteOrderMask:
                fByteOrdering = ByteOrdering.VAXOrder;
                break;

            default:
                throw new System.IO.InvalidDataException("Unknown Byte Ordering");
            }

            byte
                fLowPad      = (byte)(fFlags.HasFlag(Flags.LowPad) ? 1 : 0),
                fHighPad     = (byte)(fFlags.HasFlag(Flags.HighPad) ? 1 : 0),
                fInternalPad = (byte)(fFlags.HasFlag(Flags.InternalPad) ? 1 : 0);


            MantissaNormalization
                fMantissaNormalization;
            byte
                fMantissaNormFlags = (byte)((byte)(Flags.MantissaNormalizationMask & fFlags) >> 4);

            if (fMantissaNormFlags > (byte)MantissaNormalization.MsbSetNotStorred)
            {
                throw new System.IO.InvalidDataException("Unknown Mantissa Normalization");
            }
            fMantissaNormalization = (MantissaNormalization)fMantissaNormFlags;

            ushort
                fSignLocation = (ushort)((0x00FF00 & aHeader.Flags) >> 8);

            ushort
                fBitOffset    = aReader.ReadUInt16(),
                fBitPrecision = aReader.ReadUInt16();
            byte
                fExponentLocation = aReader.ReadByte(),
                fExponentSize     = aReader.ReadByte(),
                fMantissaLocation = aReader.ReadByte(),
                fMantissaSize     = aReader.ReadByte();
            uint
                fExponentBias = aReader.ReadUInt32();

            aBytes = mcAddionalSize;
            return(new FloatingPointDataType(
                       aHeader,
                       fByteOrdering,
                       fHighPad,
                       fLowPad,
                       fInternalPad,
                       fSignLocation,
                       fBitOffset,
                       fBitPrecision,
                       fExponentLocation,
                       fExponentSize,
                       fMantissaLocation,
                       fMantissaSize,
                       fExponentBias));
        }