xorvrn
Newbie | Редактировать | Профиль | Сообщение | Цитировать | Сообщить модератору WingfirE код примера вообще неверен. 0) Список сигнатур будет заполняться при каждом вызове метода. Это плохо. 1) Все, что идет после return formats.Where(x => content.SequenceEqual(x.bytes)).Select(x => x.name).FirstOrDefault(); выполняться не будет. 2) SequenceEqual сработает только при одинаковых объектах. А ты пытаешься сравнить файл (сигнатура + содержимое) с только сигнатурой, естественно это не одно и то же. 3) Условие if (format.bytes[i] == content[i]) {continue; } лишнее, достаточно второго условия. Ну и хорошо бы проверять, что длинна контента больше или равна длине сигнатуры. Код: using System; using System.Collections.Generic; using System.IO; namespace ConsoleApplication9 { class Program { static void Main() { byte[] content = File.ReadAllBytes(@"Z:\error.png"); // может быть опасным при попытке открыть большой файл. ЛУчше сделать считывание начала файла Console.WriteLine(Data.Format(content)); Console.ReadLine(); } } struct Signature { public string Name; public byte[] Bytes; } public static class Data { private static readonly List<Signature> Formats = new List<Signature> { new Signature {Name = "PNG", Bytes = new byte[] {137, 80, 78, 71, 13, 10, 26, 10}}, (new Signature {Name = "ACCDB", Bytes = new byte[] {0, 1, 0, 0, 83, 116, 97, 110, 100, 97, 114, 100, 32, 65, 67, 69, 32, 68, 66}}), (new Signature {Name = "MDB", Bytes = new byte[] {0, 1, 0, 0, 83, 116, 97, 110, 100, 97, 114, 100, 32, 74, 101, 116, 32, 68, 66}}), (new Signature {Name = "IMG", Bytes = new byte[] {0, 1, 0, 8, 0, 1, 0, 1, 1}}), (new Signature {Name = "MDF", Bytes = new byte[] {0, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 0, 0, 2, 0, 1}}), (new Signature {Name = "PIC", Bytes = new byte[] {1, 0, 0, 0, 1}}), (new Signature {Name = "MDF", Bytes = new byte[] {1, 15, 0, 0}}), (new Signature {Name = "XLS", Bytes = new byte[] {9, 8, 16, 0, 0, 6, 5, 0}}), (new Signature {Name = "DOC", Bytes = new byte[] {13, 68, 79, 67}}), (new Signature {Name = "PPT", Bytes = new byte[] {15, 0, 232, 8}}), (new Signature {Name = "PDF", Bytes = new byte[] {37, 80, 68, 70}}), (new Signature {Name = "7Z", Bytes = new byte[] {55, 122, 188, 175, 39, 28}}), (new Signature {Name = "PSD", Bytes = new byte[] {56, 66, 80, 83}}), (new Signature {Name = "JPG", Bytes = new byte[] {255, 216, 255, 224}}), }; public static string Format(byte[] content) { if (content == null || content.Length == 0) //можно поставить минимальную длинну сигнатуры { return "Пустой файл"; } foreach (var signature in Formats) { if (signature.Bytes.Length > content.Length) { continue; } int i; for (i = 0; i < signature.Bytes.Length; i++) { if (content[i] != signature.Bytes[i]) { break; } } if (i == signature.Bytes.Length) { return signature.Name; } } return "Неизвестный тип файла"; } } } | |