public override void WriteFooter(Stream stream, List <IWriteFile> files, int[] sizes, int[] CRCs) { DirPosition = (int)stream.Position; ICryptoTransform cryptoTrans = new CryptoTransformOneCode(DirMask); CryptoStream cryptoStream = new CryptoStream(stream, cryptoTrans, CryptoStreamMode.Write); BinaryWriter cryptoWriter = new BinaryWriter(cryptoStream); byte[] nameBuf = new byte[128]; for (int i = 0, offset = 4; i < files.Count; i++) { cryptoWriter.Write(offset); cryptoWriter.Write(sizes[i]); Utility.EncodingShiftJIS.GetBytes(files[i].Name).CopyTo(nameBuf, 0); int len = files[i].Name.Length; while (len < nameBuf.Length && nameBuf[len] != 0) { nameBuf[len++] = 0; } cryptoWriter.Write(nameBuf); cryptoWriter.Write(CRCs[i]); offset += sizes[i]; } BinaryWriter writer = new BinaryWriter(stream); writer.Write(DirMask); writer.Write(DirPosition); }
public override List <IWriteFile> ReadDirectory(string path) { List <IWriteFile> subfiles = null; using (BinaryReader reader = new BinaryReader(File.OpenRead(path))) { int numFiles = reader.ReadInt32() & (int)~0x80000000; reader.BaseStream.Seek(-8, SeekOrigin.End); DirMask = reader.ReadBytes(4); DirPosition = reader.ReadInt32(); reader.BaseStream.Seek(DirPosition, SeekOrigin.Begin); ICryptoTransform cryptoTrans = new CryptoTransformOneCode(DirMask); CryptoStream cryptoStream = new CryptoStream(reader.BaseStream, cryptoTrans, CryptoStreamMode.Read); using (BinaryReader cryptoReader = new BinaryReader(cryptoStream)) { subfiles = new List <IWriteFile>(numFiles); for (int i = 0; i < numFiles; i++) { fpkSubfile subfile = new fpkSubfile(path); subfile.offset = cryptoReader.ReadUInt32(); subfile.size = cryptoReader.ReadUInt32(); byte[] nameBuf = cryptoReader.ReadBytes(128); int len = 0; while (len < nameBuf.Length && nameBuf[len] != 0) { len++; } subfile.Name = Utility.EncodingShiftJIS.GetString(nameBuf, 0, len); subfile.crc = cryptoReader.ReadInt32(); subfiles.Add(subfile); try { if (Hash(nameBuf) != subfile.crc) { Report.ReportLog("bad hash code for <" + subfile.Name + ">"); } } catch { } } } } return(subfiles); }