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

            int
                fTagSize = (int)aHeader.Flags & byte.MaxValue;

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

            byte[]
            fTagBytes = new byte[fTagSize];

            int
                fReadByteCount = aReader.Read(fTagBytes, 0, fTagSize);

            if (fReadByteCount != fTagSize)
            {
                throw new EndOfStreamException("Could not read entire Opaque data type");
            }

            String
                fAsciiTag = Encoding.ASCII.GetString(fTagBytes).TrimEnd((char)0);

            aBytes = fTagSize;

            return(new OpaqueDataType(
                       aHeader,
                       fAsciiTag));
        }
Ejemplo n.º 2
0
        public static DatatypeHeader Read(Hdf5Reader aStream)
        {
            byte[]
            fBuffer = new byte[HeaderSize];
            if (4 != aStream.Read(fBuffer, 0, 4))
            {
                throw new EndOfStreamException();
            }

            byte
                fVersion = (byte)((fBuffer[0] >> 4) & 0xF);

            if (fVersion < (byte)DatatypeVersion.Version1 || fVersion > (byte)DatatypeVersion.Version3)
            {
                throw new UnknownMessageVersion <Datatype>(fVersion);
            }

            byte
                fClass = (byte)(fBuffer[0] & 0xF);

            if (fClass > (byte)DatatypeClass.Array)
            {
                throw new InvalidDataException($"Unkown Datatype Class {fClass}");
            }
            uint
                fFlags = (uint)(fBuffer[1] |
                                fBuffer[2] << 8 |
                                fBuffer[3] << 16);
            uint
                fSize = aStream.ReadUInt32();

            return(new DatatypeHeader(
                       (DatatypeVersion)fVersion,
                       (DatatypeClass)fClass,
                       fFlags,
                       fSize));
        }
Ejemplo n.º 3
0
 public IObjectHeader ReadHeaderAt(long aHeaderLocation)
 {
     using (Hdf5Reader fReader = mrStreamProvider.GetReader())
     {
         const int
             fcHeadBytes = 4;
         byte[]
         fHead = new byte[fcHeadBytes];
         if (fcHeadBytes != fReader.Read(fHead, 0, fcHeadBytes))
         {
             throw new System.IO.EndOfStreamException(
                       $"Could not read header at 0x{aHeaderLocation:x16}");
         }
         if (fHead[0] == 1 && fHead[1] == 0)
         {
             return(V1ObjectHeader.Read(fHead, fReader));
         }
         if (fHead.Zip(msrV2Header, (arg1, arg2) => arg1 == arg2).All(a => a))
         {
             return(V2ObjectHeader.Read(fReader));
         }
     }
     throw new Exceptions.CorruptObjectHeader("Could not determine Header version");
 }