Exemplo n.º 1
0
        public static Header ReadHeader(BinaryReader reader, out int headerSize)
        {
            var magicBytes = reader.ReadBytes(8);

            if (!magicBytes.SequenceEqual(Constants.MagicBytes))
            {
                throw new Exception("Not a FlatGeobuf file");
            }

            headerSize = reader.ReadInt32();
            var header = Header.GetRootAsHeader(new ByteBuffer(reader.ReadBytes(headerSize)));

            return(header);
        }
Exemplo n.º 2
0
        /// <summary>
        /// Reads the header of a FlatGeobuf stream
        /// </summary>
        /// <param name="stream">The FlatGeobuf stream</param>
        /// <returns>The header</returns>
        /// <exception cref="InvalidDataException">Thrown if the stream does not contain FlatGeobuf data</exception>
        internal static async ValueTask <HeaderT> ReadHeaderAsync(Stream stream, CancellationToken token)
        {
            byte[] smallBuffer = new byte[8];
            // Read & check magic bytes
            int numRead = await stream.ReadAsync(smallBuffer, 0, 8, token);

            if (numRead != 8)
            {
                throw new InvalidDataException("Insufficient stream size");
            }
            if (!smallBuffer.Take(4).SequenceEqual(Constants.MagicBytes.Take(4)))
            {
                throw new InvalidDataException("Not a FlatGeobuf stream");
            }

            // Read header size
            numRead = await stream.ReadAsync(smallBuffer, 0, 4, token);

            if (numRead != 4)
            {
                throw new InvalidDataException("Insufficient stream size");
            }
            int headerSize = MemoryMarshal.Read <int>(smallBuffer);

            // Rent a buffer and read header data
            byte[] headerData = ArrayPool <byte> .Shared.Rent(headerSize);

            numRead = await stream.ReadAsync(headerData, 0, headerSize, token);

            if (numRead != headerSize)
            {
                throw new InvalidDataException("Insufficient stream size");
            }

            // Parse header, return buffer
            var header = Header.GetRootAsHeader(new ByteBuffer(headerData, 0)).UnPack();

            ArrayPool <byte> .Shared.Return(headerData);

            return(header);
        }
Exemplo n.º 3
0
 public static HeaderT DeserializeFromBinary(byte[] fbBuffer)
 {
     return(Header.GetRootAsHeader(new ByteBuffer(fbBuffer)).UnPack());
 }