public AttributeMessage(H5BinaryReader reader, Superblock superblock) : base(reader)
        {
            //var a = reader.ReadBytes(200);
            // version
            this.Version = reader.ReadByte();

            if (this.Version == 1)
            {
                reader.ReadByte();
            }
            else
            {
                this.Flags = (AttributeMessageFlags)reader.ReadByte();
            }

            // name size
            var nameSize = reader.ReadUInt16();

            // datatype size
            var datatypeSize = reader.ReadUInt16();

            // dataspace size
            var dataspaceSize = reader.ReadUInt16();

            // name character set encoding
            if (this.Version == 3)
            {
                _nameEncoding = (CharacterSetEncoding)reader.ReadByte();
            }

            // name
            if (this.Version == 1)
            {
                this.Name = H5Utils.ReadNullTerminatedString(reader, pad: true, encoding: _nameEncoding);
            }
            else
            {
                this.Name = H5Utils.ReadNullTerminatedString(reader, pad: false, encoding: _nameEncoding);
            }

            // datatype
            this.Datatype = new DatatypeMessage(reader);

            if (this.Version == 1)
            {
                var paddedSize    = (int)(Math.Ceiling(datatypeSize / 8.0) * 8);
                var remainingSize = paddedSize - datatypeSize;
                reader.ReadBytes(remainingSize);
            }

            // dataspace
            this.Dataspace = new DataspaceMessage(reader, superblock);

            if (this.Version == 1)
            {
                var paddedSize    = (int)(Math.Ceiling(dataspaceSize / 8.0) * 8);
                var remainingSize = paddedSize - dataspaceSize;
                this.Reader.Seek(remainingSize, SeekOrigin.Current);
            }

            // data
            var byteSize = H5Utils.CalculateSize(this.Dataspace.DimensionSizes, this.Dataspace.Type) * this.Datatype.Size;

            this.Data = reader.ReadBytes((int)byteSize);
        }
Esempio n. 2
0
        public AttributeMessage(H5Context context, ObjectHeader objectHeader) : base(context.Reader)
        {
            _context = context;

            // version
            this.Version = context.Reader.ReadByte();

            if (this.Version == 1)
            {
                context.Reader.ReadByte();
            }
            else
            {
                this.Flags = (AttributeMessageFlags)context.Reader.ReadByte();
            }

            // name size
            var nameSize = context.Reader.ReadUInt16();

            // datatype size
            var datatypeSize = context.Reader.ReadUInt16();

            // dataspace size
            var dataspaceSize = context.Reader.ReadUInt16();

            // name character set encoding
            if (this.Version == 3)
            {
                _nameEncoding = (CharacterSetEncoding)context.Reader.ReadByte();
            }

            // name
            if (this.Version == 1)
            {
                this.Name = H5Utils.ReadNullTerminatedString(context.Reader, pad: true, encoding: _nameEncoding);
            }
            else
            {
                this.Name = H5Utils.ReadNullTerminatedString(context.Reader, pad: false, encoding: _nameEncoding);
            }

            // datatype
            var flags1 = this.Flags.HasFlag(AttributeMessageFlags.SharedDatatype)
                ? MessageFlags.Shared
                : MessageFlags.NoFlags;

            this.Datatype = objectHeader.DecodeMessage(flags1,
                                                       () => new DatatypeMessage(context.Reader));

            if (this.Version == 1)
            {
                var paddedSize    = (int)(Math.Ceiling(datatypeSize / 8.0) * 8);
                var remainingSize = paddedSize - datatypeSize;
                context.Reader.ReadBytes(remainingSize);
            }

            // dataspace
            var flags2 = this.Flags.HasFlag(AttributeMessageFlags.SharedDataspace)
                ? MessageFlags.Shared
                : MessageFlags.NoFlags;

            this.Dataspace = objectHeader.DecodeMessage(flags2,
                                                        () => new DataspaceMessage(context.Reader, context.Superblock));

            if (this.Version == 1)
            {
                var paddedSize    = (int)(Math.Ceiling(dataspaceSize / 8.0) * 8);
                var remainingSize = paddedSize - dataspaceSize;
                this.Reader.Seek(remainingSize, SeekOrigin.Current);
            }

            // data
            var byteSize = H5Utils.CalculateSize(this.Dataspace.DimensionSizes, this.Dataspace.Type) * this.Datatype.Size;

            this.Data = context.Reader.ReadBytes((int)byteSize);
        }