コード例 #1
0
ファイル: FileManager.cs プロジェクト: veserine/Neo
        private void LoadEncodingFile()
        {
            var encodingKeyStr = mBuildConfig["encoding"].ElementAtOrDefault(1);

            if (encodingKeyStr == null)
            {
                throw new InvalidOperationException("Build config is missing encoding key");
            }

            Log.Debug(string.Format("Encoding file key is {0}", encodingKeyStr));

            var encodingKey = new Binary(encodingKeyStr.HexToBytes().Take(9).ToArray());

            if (mIndexData.ContainsKey(encodingKey) == false)
            {
                throw new InvalidOperationException("Encoding file not found");
            }

            var entry = mIndexData[encodingKey];
            var strm  = GetDataStream(entry.Index);

            using (var fileReader = new BinaryReader(strm.Stream, Encoding.UTF8, true))
            {
                fileReader.BaseStream.Position = entry.Offset + 30;
                using (var reader = new BinaryReader(BlteGetData(fileReader, entry.Size - 30)))
                {
                    reader.BaseStream.Position = 9;
                    var numEntries = reader.ReadUInt32Be();
                    reader.BaseStream.Position += 5;
                    var ofsEntries = reader.ReadUInt32Be();
                    reader.BaseStream.Position += ofsEntries + 32 * numEntries;

                    for (var i = 0; i < numEntries; ++i)
                    {
                        var curPos = reader.BaseStream.Position;
                        var keys   = reader.ReadUInt16();
                        while (keys != 0)
                        {
                            var size      = reader.ReadUInt32Be();
                            var md5       = reader.ReadBytes(16);
                            var keyValues = reader.ReadBytes(keys * 16);
                            var e         = new EncodingEntry()
                            {
                                Size = size,
                                Keys = new Binary[keys]
                            };

                            for (var j = 0; j < keys; ++j)
                            {
                                var b = j * 16;
                                e.Keys[j] = new Binary(new[]
                                {
                                    keyValues[b], keyValues[b + 1], keyValues[b + 2], keyValues[b + 3], keyValues[b + 4], keyValues[b + 5], keyValues[b + 6], keyValues[b + 7],
                                    keyValues[b + 8], keyValues[b + 9], keyValues[b + 10], keyValues[b + 11], keyValues[b + 12], keyValues[b + 13], keyValues[b + 14], keyValues[b + 15]
                                });
                            }
                            mEncodingData.Add(new Binary(md5), e);
                            keys = reader.ReadUInt16();
                        }

                        reader.BaseStream.Position = curPos + 0x1000;
                    }
                }
            }
        }
コード例 #2
0
ファイル: FileManager.cs プロジェクト: Linrasis/WoWEditor
        private void LoadEncodingFile()
        {
            var encodingKeyStr = mBuildConfig["encoding"].ElementAtOrDefault(1);
            if (encodingKeyStr == null) throw new InvalidOperationException("Build config is missing encoding key");

            var encodingKey = new Binary(encodingKeyStr.HexToBytes().Take(9).ToArray());
            if (mIndexData.ContainsKey(encodingKey) == false)
                throw new InvalidOperationException("Encoding file not found");

            var entry = mIndexData[encodingKey];
            var strm = GetDataStream(entry.Index);
            using (var fileReader = new BinaryReader(strm.Stream, Encoding.UTF8, true))
            {
                fileReader.BaseStream.Position = entry.Offset + 30;
                using (var reader = new BinaryReader(BlteGetData(fileReader, entry.Size - 30)))
                {
                    reader.BaseStream.Position = 9;
                    var numEntries = reader.ReadUInt32Be();
                    reader.BaseStream.Position += 5;
                    var ofsEntries = reader.ReadUInt32Be();
                    reader.BaseStream.Position += ofsEntries + 32 * numEntries;

                    for (var i = 0; i < numEntries; ++i)
                    {
                        var keys = reader.ReadUInt16();
                        while (keys != 0)
                        {
                            var size = reader.ReadUInt32Be();
                            var md5 = reader.ReadBytes(16);
                            var keyValues = reader.ReadBytes(keys * 16);
                            var e = new EncodingEntry()
                            {
                                Size = size,
                                Keys = new Binary[keys]
                            };

                            for (var j = 0; j < keys; ++j)
                            {
                                var b = j * 16;
                                e.Keys[j] = new Binary(new[]
                                {
                                    keyValues[b], keyValues[b + 1], keyValues[b + 2], keyValues[b + 3],keyValues[b + 4],keyValues[b + 5],keyValues[b + 6],keyValues[b + 7],
                                    keyValues[b + 8],keyValues[b + 9],keyValues[b + 10],keyValues[b + 11],keyValues[b + 12],keyValues[b + 13],keyValues[b + 14],keyValues[b + 15]
                                });
                            }
                            mEncodingData.Add(new Binary(md5), e);
                            keys = reader.ReadUInt16();
                        }

                        try
                        {
                            var curb = reader.BaseStream.ReadByte();
                            while (curb == 0) curb = reader.BaseStream.ReadByte();

                            reader.BaseStream.Position -= 1;
                        }
                        catch (EndOfStreamException) { }
                    }
                }
            }
        }