This repository has been archived on 2025-05-24. You can view files and clone it, but cannot push or open issues or pull requests.
Files
RomVault/ROMVault2/SupportedFiles/SevenZip/Structure/PackedStreamInfo.cs
2015-03-18 08:48:48 -05:00

92 lines
3.5 KiB
C#

using System;
using System.IO;
namespace ROMVault2.SupportedFiles.SevenZip.Structure
{
public class PackedStreamInfo
{
public ulong PackedSize;
public ulong? Crc;
public ulong StreamPosition;
public static void Read(BinaryReader br, out ulong packPosition, out PackedStreamInfo[] packedStreams)
{
Util.log("Begin : ReadPackInfo", 1);
packPosition = br.ReadEncodedUInt64();
Util.log("PackPosition = " + packPosition);
ulong numPackStreams = br.ReadEncodedUInt64();
Util.log("NumPackStreams = " + numPackStreams);
packedStreams = new PackedStreamInfo[numPackStreams];
for (ulong i = 0; i < numPackStreams; i++)
packedStreams[i] = new PackedStreamInfo();
ulong streamPosition = 0;
for (; ; )
{
HeaderProperty hp = (HeaderProperty)br.ReadByte();
Util.log("HeaderProperty = " + hp);
switch (hp)
{
case HeaderProperty.kSize:
for (ulong i = 0; i < numPackStreams; i++)
{
packedStreams[i].StreamPosition = streamPosition;
Util.log("PackdStream[" + i + "].StreamPosition = " + packedStreams[i].StreamPosition);
packedStreams[i].PackedSize = br.ReadEncodedUInt64();
Util.log("PackdStream[" + i + "].PackedSize = " + packedStreams[i].PackedSize);
streamPosition += packedStreams[i].PackedSize;
}
continue;
case HeaderProperty.kCRC:
for (ulong i = 0; i < numPackStreams; i++)
{
packedStreams[i].Crc = br.ReadEncodedUInt64();
Util.log("PackdStream[" + i + "].CRC = " + ((ulong)packedStreams[i].Crc).ToString("X"));
}
continue;
case HeaderProperty.kEnd:
Util.log("End : ReadPackInfo", -1);
return;
default:
throw new Exception(hp.ToString());
}
}
}
public static void Write(BinaryWriter bw,ulong packPosition, PackedStreamInfo[] packedStreams)
{
ulong numPackStreams =(ulong) packedStreams.Length;
bw.Write((byte)HeaderProperty.kPackInfo);
bw.WriteEncodedUInt64(packPosition);
bw.WriteEncodedUInt64(numPackStreams);
bw.Write((byte)HeaderProperty.kSize);
ulong streamPosition = 0;
for (ulong i = 0; i < numPackStreams; i++)
{
packedStreams[i].StreamPosition = streamPosition;
bw.WriteEncodedUInt64(packedStreams[i].PackedSize);
streamPosition += packedStreams[i].PackedSize;
}
// Only checking the first CRC assuming all the reset will be the same
if (packedStreams[0].Crc != null)
{
bw.Write((byte) HeaderProperty.kCRC);
for (ulong i = 0; i < numPackStreams; i++)
bw.WriteEncodedUInt64(packedStreams[i].Crc??0);
}
bw.Write((byte)HeaderProperty.kEnd);
}
}
}