private int ReadFileIndexerOfName(byte[] buffer, int offset, VpkContainedFileDescription fileNode) { fileNode.meta.crc32 = BitConverter.ToUInt32(buffer, offset); offset += 4; fileNode.meta.preloadLength = BitConverter.ToInt16(buffer, offset); Debug.WriteLineIf(fileNode.meta.preloadLength != 0, fileNode.meta.preloadLength); offset += 2; fileNode.meta.archieveIndex = BitConverter.ToInt16(buffer, offset); offset += 2; fileNode.meta.archieveOffset = BitConverter.ToInt32(buffer, offset); offset += 4; fileNode.meta.fileLength = BitConverter.ToInt32(buffer, offset); offset += 4; ushort suffix = BitConverter.ToUInt16(buffer, offset); if (suffix != ContainedFileMeta.Suffix) { Debug.WriteLine(String.Format( "ERROR: File index parsing: Unexpected suffix while reading file meta from index, expecting {0:X}, got {1:X}.", ContainedFileMeta.Suffix, suffix)); throw new VpkException(VpkException.ExceptionReason.Unknown); } offset += 2; if (fileNode.meta.archieveIndex == 0x7fff) { fileNode.meta.archieveOffset += header.headerSize + header.directorySize; } fileNode.preload = new byte[fileNode.meta.preloadLength]; Array.Copy(buffer, offset, fileNode.preload, 0, fileNode.meta.preloadLength); offset += fileNode.meta.preloadLength; return(offset); }
public VpkContainedFileStream(VpkContainedFileDescription desc, FileInfo fileInfo) { this.desc = desc; fileStream = fileInfo.OpenRead(); fileStream.Position = desc.meta.archieveOffset; position = 0; }
public byte[] GetContainedFileBytes(VpkContainedFileDescription description) { var len = description.meta.fileLength + description.meta.preloadLength; using (var stream = new VpkContainedFileStream(description, fileInfo)) { byte[] arr = new byte[len]; stream.Read(arr, 0, len); return(arr); } }
public string GetContainedFileText(VpkContainedFileDescription description) { using (var reader = new StreamReader( // This way. The file can be in UTF8 with or w/o BOM and UTF16. // https://stackoverflow.com/questions/3545402/any-difference-between-file-readalltext-and-using-a-streamreader-to-read-file // https://stackoverflow.com/questions/11701341/encoding-utf8-getstring-doesnt-take-into-account-the-preamble-bom new VpkContainedFileStream(description, fileInfo), Encoding.UTF8, true)) { return(reader.ReadToEnd()); } }
private int ReadUnderPath(byte[] buffer, int offset, Dictionary <string, VpkContainedFileDescription> pathNode) { int maxLen = buffer.Length; while (offset < maxLen) { var name = CStringUtil.ReadCString(buffer, ref offset); if (name.Length == 0) { break; } //name = JoinPath(path, name, extensionName); var fileNode = new VpkContainedFileDescription(name); pathNode[name] = fileNode; offset = ReadFileIndexerOfName(buffer, offset, fileNode); } return(offset); }