12345678910111213141516171819202122232425262728293031323334353637383940414243444546474849 |
- using System.IO;
- using System.Linq;
- using System.Text;
- using SharpCompress.IO;
- namespace SharpCompress.Compressors.Xz
- {
- public class XZFooter
- {
- private readonly BinaryReader _reader;
- private readonly byte[] _magicBytes = { 0x59, 0x5A };
- public long StreamStartPosition { get; private set; }
- public long BackwardSize { get; private set; }
- public byte[] StreamFlags { get; private set; }
- public XZFooter(BinaryReader reader)
- {
- _reader = reader;
- StreamStartPosition = reader.BaseStream.Position;
- }
- public static XZFooter FromStream(Stream stream)
- {
- var footer = new XZFooter(new BinaryReader(new NonDisposingStream(stream), Encoding.UTF8));
- footer.Process();
- return footer;
- }
- public void Process()
- {
- uint crc = _reader.ReadLittleEndianUInt32();
- byte[] footerBytes = _reader.ReadBytes(6);
- uint myCrc = Crc32.Compute(footerBytes);
- if (crc != myCrc)
- throw new InvalidDataException("Footer corrupt");
- using (var stream = new MemoryStream(footerBytes))
- using (var reader = new BinaryReader(stream))
- {
- BackwardSize = (reader.ReadLittleEndianUInt32() + 1) * 4;
- StreamFlags = reader.ReadBytes(2);
- }
- byte[] magBy = _reader.ReadBytes(2);
- if (!magBy.SequenceEqual(_magicBytes))
- {
- throw new InvalidDataException("Magic footer missing");
- }
- }
- }
- }
|