protected bool DetectWithWzImage(Wz_File wzFile, Wz_Image testWzImg) { while (wzFile.header.TryGetNextVersion()) { uint offs = wzFile.CalcOffset(testWzImg.HashedOffsetPosition, testWzImg.HashedOffset); if (offs < wzFile.header.DirEndPosition || offs + testWzImg.Size > wzFile.fileStream.Length) //img offset out of file size { continue; } wzFile.fileStream.Position = offs; var firstByte = (byte)wzFile.fileStream.ReadByte(); if (!FastCheckFirstByte(testWzImg, firstByte)) { continue; } testWzImg.Offset = offs; if (!testWzImg.TryExtract()) { continue; } testWzImg.Unextract(); wzFile.header.VersionChecked = true; break; } return(wzFile.header.VersionChecked); }
protected bool DetectWithAllWzDir(Wz_File wzFile) { while (wzFile.header.TryGetNextVersion()) { bool isSuccess = wzFile.directories.All(testDir => { uint offs = wzFile.CalcOffset(testDir.HashedOffsetPosition, testDir.HashedOffset); if (offs < wzFile.header.DataStartPosition || offs + 1 > wzFile.header.DirEndPosition) // dir offset out of file size. { return(false); } wzFile.fileStream.Position = offs; if (wzFile.fileStream.ReadByte() != 0) // for splitted wz format, dir data only contains one byte: 0x00 { return(false); } return(true); }); if (isSuccess) { wzFile.header.VersionChecked = true; break; } } return(wzFile.header.VersionChecked); }
protected void CalcOffset(Wz_File wzFile, IEnumerable <Wz_Image> imgList) { foreach (var img in imgList) { img.Offset = wzFile.CalcOffset(img.HashedOffsetPosition, img.HashedOffset); } }
protected bool FastDetectWithAllWzImages(Wz_File wzFile, IList <Wz_Image> imgList) { var imageSizes = new SizeRange[imgList.Count]; while (wzFile.header.TryGetNextVersion()) { int count = 0; bool isSuccess = imgList.All(img => { uint offs = wzFile.CalcOffset(img.HashedOffsetPosition, img.HashedOffset); if (offs < wzFile.header.DirEndPosition || offs + img.Size > wzFile.fileStream.Length) //img offset out of file size { return(false); } imageSizes[count++] = new SizeRange() { Start = offs, End = offs + img.Size, }; return(true); }); if (isSuccess) { // check if there's any image overlaps with another image. Array.Sort(imageSizes, 0, count); for (int i = 1; i < count; i++) { if (imageSizes[i - 1].End > imageSizes[i].Start) { isSuccess = false; break; } } if (isSuccess) { wzFile.header.VersionChecked = true; break; } } } return(wzFile.header.VersionChecked); }