Exemplo n.º 1
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);
        }
Exemplo n.º 2
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();
        }
Exemplo n.º 3
0
        internal static Datatype ReadMessage(
            DatatypeHeader aHeader,
            Hdf5Reader aReader,
            long?aLocalMessageSize,
            out long aBytes)
        {
            if (aHeader.Class != DatatypeClass.Array)
            {
                throw new ArgumentException(
                          $"aHeader must be for type {nameof(DatatypeClass.Array)}");
            }
            bool
                fReadPermutaions;
            long
                fSize = sizeof(uint);

            switch (aHeader.Version)
            {
            case DatatypeVersion.Version1:
                throw new UnknownMessageVersion <ArrayDataType>(
                          (int)aHeader.Version,
                          "Arrays are not supported in verion 1");

            case DatatypeVersion.Version2:
                fReadPermutaions = true;
                break;

            default:
                fReadPermutaions = false;
                break;
            }

            byte
                fDimensionality = aReader.ReadByte();

            aReader.Seek(3, System.IO.SeekOrigin.Current); // Reserved bytes

            uint[]
            fDimeensions = Enumerable
                           .Range(0, fDimensionality)
                           .Select(a => aReader.ReadUInt32())
                           .ToArray();

            fSize += fDimensionality * sizeof(uint);
            if (fReadPermutaions)
            {
                if (!Enumerable.Range(0, fDimeensions.Length).All(a => a == aReader.ReadUInt32()))
                {
                    throw new Hdf5UnsupportedFeature("Custom permutations not supported");
                }
                fSize += fDimensionality * sizeof(uint);
            }

            long?
                fBaseLocalmessageSize = aLocalMessageSize;

            if (fBaseLocalmessageSize.HasValue)
            {
                fBaseLocalmessageSize -= fSize;
            }


            long
                fBaseTypeSize;
            Datatype
                fBaseType = Datatype.Read(aReader, fBaseLocalmessageSize, out fBaseTypeSize);

            aBytes = fSize + fBaseTypeSize;

            return(new ArrayDataType(aHeader, fDimeensions, fBaseType));
        }
Exemplo n.º 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));
        }