private CR2WBufferInfo WriteBuffer(BinaryWriter writer, RedBuffer buffer) { var result = new CR2WBufferInfo { flags = buffer.Flags, offset = (uint)writer.BaseStream.Position, memSize = buffer.MemSize }; var compBuf = buffer.GetCompressedBytes(); writer.Write(compBuf); result.diskSize = (uint)compBuf.Length; result.crc32 = Crc32Algorithm.Compute(compBuf); return(result); }
private void WriteBufferData(RedBuffer buffer) { if (buffer.Data is Package04 p4) { using var ms = new MemoryStream(); using var packageWriter = new PackageWriter(ms); packageWriter.WritePackage(p4, _file.RootChunk.GetType()); var newData = ms.ToArray(); /*var oldData = buffer.GetBytes(); * if (!oldData.SequenceEqual(newData)) * { * File.WriteAllBytes(@"C:\Dev\C77\Buffer\OldBuffer.bin", oldData); * File.WriteAllBytes(@"C:\Dev\C77\Buffer\NewBuffer.bin", newData); * }*/ buffer.SetBytes(newData); } }
public EFileReadErrorCodes ReadBuffer(RedBuffer buffer, Type fileRootType) { _hashService = Locator.Current.GetService <IHashService>(); var _chunks = new List <RedBaseClass>(); var result = new Package04(); _outputFile = result; header.version = BaseReader.ReadUInt16(); if (header.version < 2 || header.version > 4) { return(EFileReadErrorCodes.UnsupportedVersion); } header.numSections = _reader.ReadUInt16(); if (header.numSections < 6 || header.numSections > 7) { return(EFileReadErrorCodes.UnsupportedVersion); } result.Version = header.version; result.Sections = header.numSections; header.numComponents = _reader.ReadUInt32(); if (header.numSections == 7) { header.refPoolDescOffset = _reader.ReadUInt32(); header.refPoolDataOffset = _reader.ReadUInt32(); } header.namePoolDescOffset = _reader.ReadUInt32(); header.namePoolDataOffset = _reader.ReadUInt32(); header.chunkDescOffset = _reader.ReadUInt32(); header.chunkDataOffset = _reader.ReadUInt32(); if (header.numSections == 7 && header.refPoolDescOffset != 0) { return(EFileReadErrorCodes.NoCr2w); } if (header.refPoolDescOffset != 0) { return(EFileReadErrorCodes.NoCr2w); } if (fileRootType == typeof(gamePersistentStateDataResource)) { var numCruids = _reader.ReadUInt32(); for (var i = 0; i < numCruids; i++) { result.RootCruids.Add(_reader.ReadUInt64()); } } else if (fileRootType != typeof(inkWidgetLibraryResource)) { result.CruidIndex = _reader.ReadInt16(); var numCruids = _reader.ReadUInt16(); for (var i = 0; i < numCruids; i++) { result.RootCruids.Add(_reader.ReadUInt64()); } } var baseOff = BaseStream.Position; // read refs var refCount = (header.refPoolDataOffset - header.refPoolDescOffset) / 4; BaseStream.Position = baseOff + header.refPoolDescOffset; var refDesc = BaseStream.ReadStructs <Package04ImportHeader>(refCount); var readAsHash = fileRootType == typeof(appearanceAppearanceResource); foreach (var r in refDesc) { BaseStream.Position = baseOff + r.offset; importsList.Add(ReadImport(r, readAsHash)); } // read strings var nameCount = (header.namePoolDataOffset - header.namePoolDescOffset) / 4; BaseStream.Position = baseOff + header.namePoolDescOffset; var nameDesc = BaseStream.ReadStructs <Package04NameHeader>(nameCount); foreach (var s in nameDesc) { BaseStream.Position = baseOff + s.offset; _namesList.Add(ReadName(s)); } // read chunks var chunkCount = (header.chunkDataOffset - header.chunkDescOffset) / 8; BaseStream.Position = baseOff + header.chunkDescOffset; var chunkDesc = BaseStream.ReadStructs <Package04ChunkHeader>(chunkCount); for (var i = 0; i < chunkDesc.Length; i++) { _chunks.Add(ReadChunk(chunkDesc[i])); } var newChunks = new List <RedBaseClass>(); for (var i = 0; i < _chunks.Count; i++) { if (!HandleQueue.ContainsKey(i)) { newChunks.Add(_chunks[i]); continue; } foreach (var handle in HandleQueue[i]) { handle.SetValue(_chunks[i]); } } result.Chunks = newChunks; buffer.Data = result; return(EFileReadErrorCodes.NoError); }