Exemplo n.º 1
0
        public static Cmpt Read(Stream stream)
        {
            using (var reader = new BinaryReader(stream))
            {
                var cmpt       = new Cmpt();
                var cmptHeader = new CmptHeader(reader);
                cmpt.CmptHeader = cmptHeader;
                var tiles  = new List <byte[]>();
                var magics = new List <string>();

                for (var i = 0; i < cmptHeader.TilesLength; i++)
                {
                    var currentPosition = reader.BaseStream.Position;
                    var magic           = Encoding.UTF8.GetString(reader.ReadBytes(4));
                    magics.Add(magic);
                    var version    = (int)reader.ReadUInt32();
                    var byteLength = (int)reader.ReadUInt32();

                    reader.BaseStream.Position = currentPosition;
                    var bytesInnertile = reader.ReadBytes(byteLength);
                    tiles.Add(bytesInnertile);
                }

                cmpt.Tiles  = tiles;
                cmpt.Magics = magics;


                return(cmpt);
            }
        }
Exemplo n.º 2
0
        public static byte[] Write(IEnumerable <byte[]> tiles)
        {
            if (!tiles.Any())
            {
                throw new ArgumentException("Inner tiles must be defined");
            }
            var stream       = new MemoryStream();
            var binaryWriter = new BinaryWriter(stream);

            var header = new CmptHeader();

            header.TilesLength = tiles.Count();

            var paddedTiles = new List <byte[]>();

            foreach (var tile in tiles)
            {
                // optional: we can do other checks here to validate inner tile
                if (tile.Length % 8 != 0)
                {
                    throw new ArgumentException("Inner tile must be 8 byte aligned");
                }
                var tilePadded = tile;
                paddedTiles.Add(tilePadded);
            }

            header.ByteLength = 16 + paddedTiles.Sum(i => i.Length);
            var headerBytes       = header.AsBinary();
            var headerBytesPadded = headerBytes;

            binaryWriter.Write(headerBytesPadded);

            foreach (var paddedTile in paddedTiles)
            {
                binaryWriter.Write(paddedTile);
            }

            binaryWriter.Flush();
            binaryWriter.Close();

            return(stream.ToArray());
        }
Exemplo n.º 3
0
        public static byte[] Write(IEnumerable <byte[]> tiles)
        {
            var stream       = new MemoryStream();
            var binaryWriter = new BinaryWriter(stream);

            var header = new CmptHeader();

            header.TilesLength = tiles.Count();
            header.ByteLength  = 16 + tiles.Sum(i => i.Length);
            var headerBytes = header.AsBinary();

            binaryWriter.Write(headerBytes);

            foreach (var tile in tiles)
            {
                binaryWriter.Write(tile);
            }
            binaryWriter.Flush();
            binaryWriter.Close();

            return(stream.ToArray());
        }