Esempio n. 1
0
 public LocalSerializedObjectIdentifier Parse(EndianBinaryReader varStream)
 {
     localSerializedFileIndex = varStream.ReadInt32();
     varStream.AlignStream();
     localIdentifierInFile = varStream.ReadInt64();
     return(this);
 }
Esempio n. 2
0
            public ObjectInfo Parse(EndianBinaryReader varStream)
            {
                varStream.AlignStream();
                LocalPathID = varStream.ReadInt64();

                byteStart = varStream.ReadInt64();

                //varStream.Seek(4,System.IO.SeekOrigin.Current);

                byteSize = varStream.ReadUInt32();
                typeID   = varStream.ReadInt32();

                return(this);
            }
        public SerializedFile Parse(EndianBinaryReader varStream)
        {
            Header = new SerializedFileHeader().Parse(varStream);

            varStream.endian = (EndianType)Header.Endianess;

            UnityVersion = varStream.ReadStringToNull();

            var tempBuildTarget = varStream.ReadInt32();

            if (Enum.IsDefined(typeof(BuildTarget), tempBuildTarget))
            {
                TargetPlatform = (BuildTarget)tempBuildTarget;
            }

            EnableTypeTree = varStream.ReadBoolean();

            var tempTypeCount = varStream.ReadInt32();

            Types = new List <SerializedType>(tempTypeCount);
            for (int i = 0; i < tempTypeCount; ++i)
            {
                var tempType = new SerializedType().Parse(varStream, EnableTypeTree, Header.Version);
                Types.Add(tempType);
            }

            var tempObjCount = varStream.ReadInt32();

            ObjectMap = new Dictionary <long, ObjectInfo>(tempObjCount);
            for (int i = 0; i < tempObjCount; ++i)
            {
                var tempObjInfo = new ObjectInfo().Parse(varStream);
                ObjectMap.Add(tempObjInfo.LocalPathID, tempObjInfo);
            }

            var tempScriptCount = varStream.ReadInt32();

            ScriptTypes = new List <LocalSerializedObjectIdentifier>(tempScriptCount);
            for (int i = 0; i < tempScriptCount; ++i)
            {
                var tempScriptTyps = new LocalSerializedObjectIdentifier().Parse(varStream);
                ScriptTypes.Add(tempScriptTyps);
            }

            var tempExternalsCount = varStream.ReadInt32();

            FileIdentifiers = new List <FileIdentifier>(tempExternalsCount);
            for (int i = 0; i < tempExternalsCount; ++i)
            {
                var tempFileID = new FileIdentifier().Parse(varStream);
                FileIdentifiers.Add(tempFileID);
            }

            var tempRefTypesCount = varStream.ReadInt32();

            RefTypes = new List <SerializedType>(tempRefTypesCount);
            for (int i = 0; i < tempRefTypesCount; ++i)
            {
                var tempType = new SerializedType().Parse(varStream, EnableTypeTree, Header.Version, true);
                Types.Add(tempType);
            }

            userInformation = varStream.ReadStringToNull();

            if (varStream.Position < (int)Alignment.kMetadataAllocation)
            {
                varStream.Seek((int)Alignment.kMetadataAllocation - varStream.Position, SeekOrigin.Current);
            }
            else
            {
                varStream.AlignStream((int)Alignment.kSectionAlignment);
            }

            return(this);
        }
        private long ReadBlocksInfoAndDirectory(EndianBinaryReader varReader)
        {
            byte[] blocksInfoBytes;
            if (HeaderInfo.version >= 7)
            {
                varReader.AlignStream(16);
            }
            if ((HeaderInfo.flags & (int)ArchiveFlags.kArchiveBlocksInfoAtTheEnd) != 0)
            {
                var tempPosition = varReader.Position;
                {
                    varReader.Position = varReader.BaseStream.Length - HeaderInfo.compressedBlocksInfoSize;
                    blocksInfoBytes    = varReader.ReadBytes((int)HeaderInfo.compressedBlocksInfoSize);
                }
                varReader.Position = tempPosition;
            }
            else //0x40 kArchiveBlocksAndDirectoryInfoCombined
            {
                blocksInfoBytes = varReader.ReadBytes((int)HeaderInfo.compressedBlocksInfoSize);
            }
            var          blocksInfoCompressedStream = new MemoryStream(blocksInfoBytes);
            MemoryStream blocksInfoUncompresseddStream;

            switch (HeaderInfo.GetBlocksInfoCompressionType())
            {
            default:     //None
            {
                blocksInfoUncompresseddStream = blocksInfoCompressedStream;
                break;
            }

            case Compression.CompressionType.kCompressionLzma:
            {
                blocksInfoUncompresseddStream = new MemoryStream((int)(HeaderInfo.uncompressedBlocksInfoSize));
                SevenZipHelper.StreamDecompress(blocksInfoCompressedStream, blocksInfoUncompresseddStream, HeaderInfo.compressedBlocksInfoSize, HeaderInfo.uncompressedBlocksInfoSize);
                blocksInfoUncompresseddStream.Position = 0;
                blocksInfoCompressedStream.Close();
                break;
            }

            case Compression.CompressionType.kCompressionLz4:
            case Compression.CompressionType.kCompressionLz4HC:
            {
                var uncompressedBytes = new byte[HeaderInfo.uncompressedBlocksInfoSize];
                using (var decoder = new Lz4DecoderStream(blocksInfoCompressedStream))
                {
                    decoder.Read(uncompressedBytes, 0, uncompressedBytes.Length);
                }
                blocksInfoUncompresseddStream = new MemoryStream(uncompressedBytes);
                break;
            }
            }
            using (var blocksInfoReader = new EndianBinaryReader(blocksInfoUncompresseddStream))
            {
                var uncompressedDataHash = blocksInfoReader.ReadBytes(16);
                var blocksInfoCount      = blocksInfoReader.ReadInt32();
                BlocksInfo = new List <StorageBlock>(blocksInfoCount);
                for (int i = 0; i < blocksInfoCount; i++)
                {
                    var tempBlock = new StorageBlock().Parse(blocksInfoReader);
                    BlocksInfo.Add(tempBlock);
                }

                var nodesCount = blocksInfoReader.ReadInt32();
                DirectoryInfo = new List <Node>(nodesCount);
                for (int i = 0; i < nodesCount; i++)
                {
                    var tempDirInfo = new Node().Parse(blocksInfoReader);
                    DirectoryInfo.Add(tempDirInfo);
                }
            }

            return(varReader.Position);
        }