diff --git a/src/FileSignatures/FileFormatInspector.cs b/src/FileSignatures/FileFormatInspector.cs index 88d366c..eefd76f 100644 --- a/src/FileSignatures/FileFormatInspector.cs +++ b/src/FileSignatures/FileFormatInspector.cs @@ -57,12 +57,12 @@ public FileFormatInspector(IEnumerable formats) RemoveBaseFormats(matches); } - if (matches.Count > 0) + if (matches.Count > 1) { return matches.OrderByDescending(m => m.HeaderLength).First(); } - return null; + return matches.Count == 1 ? matches[0] : null; } private List FindMatchingFormats(Stream stream) diff --git a/src/FileSignatures/FileSignatures.csproj b/src/FileSignatures/FileSignatures.csproj index 5a82ca6..45fdd0e 100644 --- a/src/FileSignatures/FileSignatures.csproj +++ b/src/FileSignatures/FileSignatures.csproj @@ -13,13 +13,13 @@ false false false - 5.0.2 + 5.0.3-rc1 true MIT - 5.0.2 + 5.0.3 Latest enable - 5.0.2 + 5.0.3 True ..\..\FileSignatures.snk diff --git a/src/FileSignatures/Formats/AdobePdf.cs b/src/FileSignatures/Formats/AdobePdf.cs index fe0c786..251782c 100644 --- a/src/FileSignatures/Formats/AdobePdf.cs +++ b/src/FileSignatures/Formats/AdobePdf.cs @@ -11,19 +11,16 @@ public AdobePdf() : base([ ]) { } - - protected override bool CompareFileByteToSignatureAt(byte fileByte, int signatureIndex) - { - return base.CompareFileByteToSignatureAt(fileByte, signatureIndex) || IsVersionNumber(fileByte, Signature[signatureIndex]); - } - - private static bool IsVersionNumber(byte fileByte, byte signatureByte) + + protected override bool IsSignatureByte(byte value, int signatureIndex) { - return signatureByte == VersionNumberPlaceholder && IsNumber(fileByte); + return IsVersionNumber(value, Signature[signatureIndex]) + || base.IsSignatureByte(value, signatureIndex); } - private static bool IsNumber(byte @byte) + private static bool IsVersionNumber(byte value, byte signatureByte) { - return @byte is >= 0x30 and <= 0x39; + var isNumber = value is >= 0x30 and <= 0x39; + return signatureByte == VersionNumberPlaceholder && isNumber; } } \ No newline at end of file diff --git a/src/FileSignatures/Formats/Pdf.cs b/src/FileSignatures/Formats/Pdf.cs index 50a3977..d762afb 100644 --- a/src/FileSignatures/Formats/Pdf.cs +++ b/src/FileSignatures/Formats/Pdf.cs @@ -19,64 +19,34 @@ protected Pdf(byte[] signature) : base(signature, "application/pdf", "pdf", 0) public override bool IsMatch(Stream stream) { - if (stream == null || stream.Length < HeaderLength) + if (stream == null || (stream.Length < HeaderLength && HeaderLength < int.MaxValue) || Offset > stream.Length) { return false; } - stream.Position = 0; - var signatureValidationIndex = 0; - int fileByte; + stream.Position = Offset; - while (stream.Position < MaxFileHeaderSize && (fileByte = stream.ReadByte()) != -1) + var signatureIndex = 0; + while (stream.Position < MaxFileHeaderSize && stream.Position < stream.Length) { - if (CompareFileByteToSignatureAt((byte)fileByte, signatureValidationIndex)) + var b = (byte)stream.ReadByte(); + if (IsSignatureByte(b, signatureIndex)) { - signatureValidationIndex++; + signatureIndex++; } else { - signatureValidationIndex = 0; + signatureIndex = 0; } - - if (signatureValidationIndex == Signature.Count) - return true; + + if (signatureIndex == Signature.Count) + return true; } - + return false; } - protected virtual bool CompareFileByteToSignatureAt(byte fileByte, int signatureIndex) - { - return fileByte == Signature[signatureIndex]; - } - } - - public class AdobePdf : Pdf - { - private const byte VersionNumberPlaceholder = 0x00; - - public AdobePdf() : base([ - 0x25, 0x21, 0x50, 0x53, 0x2D, 0x41, 0x64, 0x6F, 0x62, 0x65, 0x2D, VersionNumberPlaceholder, 0x2E, - VersionNumberPlaceholder, 0x20, 0x50, 0x44, - 0x46, 0x2D, VersionNumberPlaceholder, 0x2E, VersionNumberPlaceholder - ]) - { - } - - protected override bool CompareFileByteToSignatureAt(byte fileByte, int signatureIndex) - { - return base.CompareFileByteToSignatureAt(fileByte, signatureIndex) || IsVersionNumber(fileByte, Signature[signatureIndex]); - } - - private static bool IsVersionNumber(byte fileByte, byte signatureByte) - { - return signatureByte == VersionNumberPlaceholder && IsNumber(fileByte); - } - - private static bool IsNumber(byte @byte) - { - return @byte is >= 0x30 and <= 0x39; - } + protected virtual bool IsSignatureByte(byte value, int signatureIndex) + => value == Signature[signatureIndex]; } } \ No newline at end of file