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); } }
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()); }
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()); }