protected override void ReadFromReader(MarkingBinaryReader reader) { UnpSize = reader.ReadInt16(); UnpVersion = reader.ReadByte(); UnpMethod = reader.ReadByte(); CommCRC = reader.ReadInt16(); }
protected override void ReadFromReader(MarkingBinaryReader reader) { UnpackVersion = reader.ReadByte(); Method = reader.ReadByte(); AVVersion = reader.ReadByte(); AVInfoCRC = reader.ReadInt32(); }
protected override void ReadFromReader(MarkingBinaryReader reader) { HighPosAv = reader.ReadInt16(); PosAv = reader.ReadInt32(); if (ArchiveHeaderFlags.HasFlag(ArchiveFlags.ENCRYPTVER)) { EncryptionVersion = reader.ReadByte(); } }
protected override void ReadFromReader(MarkingBinaryReader reader) { if (EndArchiveFlags.HasFlag(EndArchiveFlags.EARC_DATACRC)) { ArchiveCRC = reader.ReadInt32(); } if (EndArchiveFlags.HasFlag(EndArchiveFlags.EARC_VOLNUMBER)) { VolumeNumber = reader.ReadInt16(); } }
private static DateTime? ProcessExtendedTime(ushort extendedFlags, DateTime? time, MarkingBinaryReader reader, int i) { uint rmode = (uint)extendedFlags >> (3 - i) * 4; if ((rmode & 8) == 0) { return null; } if (i != 0) { uint DosTime = reader.ReadUInt32(); time = Utilities.DosDateToDateTime(DosTime); } if ((rmode & 4) == 0) { time = time.Value.AddSeconds(1); } uint nanosecondHundreds = 0; int count = (int)rmode & 3; for (int j = 0; j < count; j++) { byte b = reader.ReadByte(); nanosecondHundreds |= (((uint)b) << ((j + 3 - count) * 8)); } //10^-7 to 10^-3 return time.Value.AddMilliseconds(nanosecondHundreds * Math.Pow(10, -4)); }
protected override void ReadFromReader(MarkingBinaryReader reader) { uint lowUncompressedSize = reader.ReadUInt32(); HostOS = (HostOS)(int)reader.ReadByte(); FileCRC = reader.ReadUInt32(); FileLastModifiedTime = Utilities.DosDateToDateTime(reader.ReadInt32()); RarVersion = reader.ReadByte(); PackingMethod = reader.ReadByte(); short nameSize = reader.ReadInt16(); FileAttributes = reader.ReadInt32(); uint highCompressedSize = 0; uint highUncompressedkSize = 0; if (FileFlags.HasFlag(FileFlags.LARGE)) { highCompressedSize = reader.ReadUInt32(); highUncompressedkSize = reader.ReadUInt32(); } else { if (lowUncompressedSize == 0xffffffff) { lowUncompressedSize = 0xffffffff; highUncompressedkSize = int.MaxValue; } } CompressedSize = UInt32To64(highCompressedSize, AdditionalSize); UncompressedSize = UInt32To64(highUncompressedkSize, lowUncompressedSize); nameSize = nameSize > 4 * 1024 ? (short)(4 * 1024) : nameSize; byte[] fileNameBytes = reader.ReadBytes(nameSize); switch (HeaderType) { case HeaderType.FileHeader: { if (FileFlags.HasFlag(FileFlags.UNICODE)) { int length = 0; while (length < fileNameBytes.Length && fileNameBytes[length] != 0) { length++; } if (length != nameSize) { length++; FileName = FileNameDecoder.Decode(fileNameBytes, length); } else { FileName = DecodeDefault(fileNameBytes); } } else { FileName = DecodeDefault(fileNameBytes); } FileName = ConvertPath(FileName, HostOS); } break; case HeaderType.NewSubHeader: { int datasize = HeaderSize - NEWLHD_SIZE - nameSize; if (FileFlags.HasFlag(FileFlags.SALT)) { datasize -= SALT_SIZE; } if (datasize > 0) { SubData = reader.ReadBytes(datasize); } if (NewSubHeaderType.SUBHEAD_TYPE_RR.Equals(fileNameBytes)) { RecoverySectors = SubData[8] + (SubData[9] << 8) + (SubData[10] << 16) + (SubData[11] << 24); } } break; } if (FileFlags.HasFlag(FileFlags.SALT)) { Salt = reader.ReadBytes(SALT_SIZE); } if (FileFlags.HasFlag(FileFlags.EXTTIME)) { ushort extendedFlags = reader.ReadUInt16(); FileLastModifiedTime = ProcessExtendedTime(extendedFlags, FileLastModifiedTime, reader, 0); FileCreatedTime = ProcessExtendedTime(extendedFlags, null, reader, 1); FileLastAccessedTime = ProcessExtendedTime(extendedFlags, null, reader, 2); FileArchivedTime = ProcessExtendedTime(extendedFlags, null, reader, 3); } }
protected override void ReadFromReader(MarkingBinaryReader reader) { CreationTime = reader.ReadInt32(); ArcNameSize = reader.ReadInt16(); UserNameSize = reader.ReadInt16(); }
private RarHeader ReadNextHeader(Stream stream) { MarkingBinaryReader reader = new MarkingBinaryReader(stream); RarHeader header = RarHeader.Create(reader); if (header == null) { return null; } switch (header.HeaderType) { case HeaderType.ArchiveHeader: { return header.PromoteHeader<ArchiveHeader>(reader); } case HeaderType.MarkHeader: { return header.PromoteHeader<MarkHeader>(reader); } case HeaderType.NewSubHeader: { FileHeader fh = header.PromoteHeader<FileHeader>(reader); switch (StreamingMode) { case StreamingMode.Seekable: { fh.DataStartPosition = reader.BaseStream.Position; reader.BaseStream.Position += fh.CompressedSize; } break; case StreamingMode.Streaming: { //skip the data because it's useless? reader.BaseStream.Skip(fh.CompressedSize); } break; default: { throw new InvalidRarFormatException("Invalid StreamingMode"); } } return fh; } case HeaderType.FileHeader: { FileHeader fh = header.PromoteHeader<FileHeader>(reader); switch (StreamingMode) { case StreamingMode.Seekable: { fh.DataStartPosition = reader.BaseStream.Position; reader.BaseStream.Position += fh.CompressedSize; } break; case StreamingMode.Streaming: { ReadOnlySubStream ms = new ReadOnlySubStream(reader.BaseStream, fh.CompressedSize); fh.PackedStream = ms; } break; default: { throw new InvalidRarFormatException("Invalid StreamingMode"); } } return fh; } case HeaderType.EndArchiveHeader: { return header.PromoteHeader<EndArchiveHeader>(reader); } default: { throw new InvalidRarFormatException("Invalid Rar Header: " + header.HeaderType.ToString()); } } }
protected override void ReadFromReader(MarkingBinaryReader reader) { }