Автор: xorvrn
Дата сообщения: 10.03.2014 01:12
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 "Неизвестный тип файла";
}
}
}