Exemplo n.º 1
0
        public static MemoryStream LoadBLTEEntry(IndexEntry idxEntry, BinaryReader readStream = null, bool downloaded = false)
        {
            lock (readLock)
            {
                if (readStream == null)
                {
                    return(null);
                }

                if (!downloaded)
                {
                    readStream.BaseStream.Position = idxEntry.Offset + 30;
                }

                if (readStream.ReadUInt32() != 0x45544C42)
                {
                    Trace.TraceError($"data.{idxEntry.Index:000}: Invalid BLTE signature at 0x{readStream.BaseStream.Position:X8}.");

                    return(null);
                }

                var blte = new BLTEEntry();
                var frameHeaderLength = readStream.ReadBEInt32();
                var chunks            = 0u;
                var size = 0L;

                if (frameHeaderLength == 0)
                {
                    chunks = 1;
                    size   = idxEntry.Size - 38;
                }
                else
                {
                    readStream.BaseStream.Position += 1;
                    chunks = readStream.ReadUInt24();
                }

                blte.Chunks = new BLTEChunk[chunks];

                for (var i = 0; i < chunks; i++)
                {
                    if (frameHeaderLength == 0)
                    {
                        blte.Chunks[i].CompressedSize   = size;
                        blte.Chunks[i].UncompressedSize = size - 1;
                    }
                    else
                    {
                        blte.Chunks[i].CompressedSize   = readStream.ReadBEInt32();
                        blte.Chunks[i].UncompressedSize = readStream.ReadBEInt32();

                        // Skip MD5 hash
                        readStream.BaseStream.Position += 16;
                    }
                }

                var data = new MemoryStream();

                for (var i = 0; i < chunks; i++)
                {
                    var formatCode = readStream.ReadByte();
                    var dataBytes  = readStream.ReadBytes((int)blte.Chunks[i].CompressedSize - 1);

                    // Not compressed
                    if (formatCode == 0x4E)
                    {
                        data.Write(dataBytes, 0, (int)blte.Chunks[i].UncompressedSize);
                    }
                    // Compressed
                    else if (formatCode == 0x5A)
                    {
                        using (var decompressed = new MemoryStream())
                        {
                            using (var inflate = new DeflateStream(new MemoryStream(dataBytes, 2, dataBytes.Length - 2), CompressionMode.Decompress))
                                inflate.CopyTo(decompressed);

                            var inflateData = decompressed.ToArray();
                            data.Write(inflateData, 0, inflateData.Length);
                        }
                    }
                    else
                    {
                    }
                }

                data.Position = 0;


                return(data);
            }
        }
Exemplo n.º 2
0
        public static MemoryStream LoadBLTEEntry(IndexEntry idxEntry, BinaryReader readStream = null, bool downloaded = false)
        {
            lock (readLock)
            {
                if (readStream == null)
                {
                    return(null);
                }

                if (!downloaded)
                {
                    readStream.BaseStream.Position = idxEntry.Offset + 30;
                }

                if (readStream.ReadUInt32() != 0x45544C42)
                {
                    Trace.TraceError($"data.{idxEntry.Index:000}: Invalid BLTE signature at 0x{readStream.BaseStream.Position:X8}.");
                    return(null);
                }

                var blte = new BLTEEntry();
                var frameHeaderLength = readStream.ReadBEInt32();
                var chunks            = 0u;
                var size = 0L;

                if (frameHeaderLength == 0)
                {
                    chunks = 1;
                    size   = idxEntry.Size - 38;
                }
                else
                {
                    readStream.BaseStream.Position += 1;
                    chunks = readStream.ReadUInt24();
                }

                blte.Chunks = new BLTEChunk[chunks];

                for (var i = 0; i < chunks; i++)
                {
                    if (frameHeaderLength == 0)
                    {
                        blte.Chunks[i].CompressedSize   = size;
                        blte.Chunks[i].UncompressedSize = size - 1;
                    }
                    else
                    {
                        blte.Chunks[i].CompressedSize   = readStream.ReadBEInt32();
                        blte.Chunks[i].UncompressedSize = readStream.ReadBEInt32();

                        // Skip MD5 hash
                        readStream.BaseStream.Position += 16;
                    }
                }

                var data = new MemoryStream();

                for (int i = 0; i < chunks; i++)
                {
                    var dataBytes = readStream.ReadBytes((int)blte.Chunks[i].CompressedSize);
                    HandleDataBlock(dataBytes, i, data);
                }

                data.Position = 0;
                return(data);
            }
        }