public void CanCompressData()
        {
            // Arrange
            var testData = new byte[] { 55, 66, 55, 66, 77, 88, 0, 11, 0, 22, 0, 33, 0, 22, 0, 11, 0, 0, 0, 0, 0, 0, 0, 44, 44, 44, 44, 44, 44, 44, 55, 66, 77, 88, 99 };

            // Act
            var compressed   = Gyu0.Compress(new BinaryFile(testData));
            var decompressed = Gyu0.Decompress(compressed);

            // Assert
            var decompressedArray = decompressed.ReadArray();

            decompressedArray.Should().Equal(testData);
        }
            public Entry(IReadOnlyBinaryDataAccessor accessor)
            {
                var buffer = Gyu0.Decompress(accessor);

                Sir0 sir0              = new Sir0(buffer);
                var  offsetHeader      = sir0.SubHeader.ReadInt64(0x00);
                var  offsetWildPokemon = sir0.SubHeader.ReadInt64(0x08);
                var  offset3           = sir0.SubHeader.ReadInt64(0x10);
                var  offset4           = sir0.SubHeader.ReadInt64(0x18);
                var  lenHeader         = offsetWildPokemon - offsetHeader;
                var  lenWildPokemon    = offset3 - offsetWildPokemon;
                var  len3              = offset4 - offset3;
                var  len4              = sir0.SubHeaderOffset - offset4;

                var headerEntrySize = FloorInfoEntry.Size;
                var entryCount      = lenHeader / headerEntrySize;

                FloorInfos = new FloorInfoEntry[entryCount];
                for (int i = 0; i < lenHeader / headerEntrySize; i++)
                {
                    FloorInfos[i] = new FloorInfoEntry(sir0.Data.Slice(offsetHeader + i * headerEntrySize, headerEntrySize));
                }

                if (lenWildPokemon > 0)
                {
                    WildPokemon = new WildPokemonInfo(sir0.Data.Slice(offsetWildPokemon, lenWildPokemon));
                }
                if (len3 > 0)
                {
                    Data3 = new DungeonBalanceDataEntry3(sir0.Data.Slice(offset3, len3));
                }
                if (len4 > 0)
                {
                    Data4 = new DungeonBalanceDataEntry4(sir0.Data.Slice(offset4, len4));
                }
            }
        public (byte[] bin, byte[] ent) Build()
        {
            MemoryStream bin           = new MemoryStream();
            var          entryPointers = new List <int>();

            // Build the .bin file data
            entryPointers.Add(0);
            foreach (var entry in Entries)
            {
                // Build SIR0 and compress to GYU0
                var sir0 = entry.ToSir0();
                var data = Gyu0.Compress(sir0.Data);

                // Write data to .bin and the pointer to .ent
                // Align data to 16 bytes
                var binData = data.ReadArray();
                bin.Write(binData, 0, binData.Length);
                var paddingLength = 16 - (bin.Length % 16);
                if (paddingLength != 16)
                {
                    bin.SetLength(bin.Length + paddingLength);
                    bin.Position = bin.Length;
                }
                entryPointers.Add((int)bin.Position);
            }

            // Build the .ent file data
            var ent = new byte[entryPointers.Count * sizeof(int)];

            for (int i = 0; i < entryPointers.Count; i++)
            {
                BitConverter.GetBytes(entryPointers[i]).CopyTo(ent, i * sizeof(int));
            }

            return(bin.ToArray(), ent);
        }