Форум программистов, компьютерный форум, киберфорум
C# для начинающих
Войти
Регистрация
Восстановить пароль
Блоги Сообщество Поиск Заказать работу  
 
Рейтинг 4.69/13: Рейтинг темы: голосов - 13, средняя оценка - 4.69
44 / 41 / 35
Регистрация: 27.02.2013
Сообщений: 284

"Угадать" формат файла используя магическую последовательность

01.02.2015, 15:18. Показов 2852. Ответов 3
Метки нет (Все метки)

Студворк — интернет-сервис помощи студентам
В общем задача такая: В папке находятся файлы с расширением bin. Требуется «угадать» формат файла и дать ему правильное расширение. Формат файла можно узнать проанализировав начальные байты. То есть если в начале файла найдена одна из последовательностей байтов в таблице ниже, то файл имеет соответствующий формат, и его требуется переименовать. Если формат файла определить не удалось, то переименовывать его не нужно.
Формат «Магическая» последовательность
PNG 0x89, 0x50, 0x4E, 0x47, 0x0D, 0x0A, 0x1A, 0x0A, 0x00, 0x00, 0x00, 0x0D, 0x49, 0x48, 0x44, 0x52
JPG 0xFF, 0xD8, 0xFF
GIF 0x47, 0x49, 0x46, 0x38


у меня есть начало
C#
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
static void Main(string[] args)
        {
 
            using (FileStream fstream = File.OpenRead("d:\\extension"))
            {
                // преобразуем строку в байты
                byte[] array = new byte[fstream.Length];
                // считываем данные
                fstream.Read(array, 0, array.Length);
 
                string png = "0x89, 0x50, 0x4E, 0x47, 0x0D, 0x0A, 0x1A, 0x0A, 0x00, 0x00, 0x00, 0x0D, 0x49, 0x48, 0x44, 0x52";
                string gpg = "0xFF, 0xD8, 0xFF";
                string gif = "0x47, 0x49, 0x46, 0x38";
 
                byte[] array1 = new byte[png.Length];
                byte[] array2 = new byte[gpg.Length];
                byte[] array3 = new byte[gif.Length];
потом я собираюсь сравнивать array и array1, array2, array3. Можно ли так делать? Или подскажите в каком направлении идти
0
Лучшие ответы (1)
cpp_developer
Эксперт
20123 / 5690 / 1417
Регистрация: 09.04.2010
Сообщений: 22,546
Блог
01.02.2015, 15:18
Ответы с готовыми решениями:

Угадать две введенные буквы используя switch-case
Написать программу, которая "загадывает" буквы от С1 до С2 и предлагает пользователю угадать букву за 5 попыток. Буквы С1 и С2 вводятся с...

Создать текстовой формат обмена данных JSON используя данных из текстового файла info.txt
Создать текстовой формат обмена данных JSON с помощью данных из текстового файла info.txt. info={"Иванов И.А.":, ...

Напечатайте магическую мантру
Напечатайте магическую мантру, она поможет справиться с ними: Я расправлюсь с задачей 1 Я расправлюсь с задачей 2 Я расправлюсь с...

3
Администратор
Эксперт .NET
 Аватар для OwenGlendower
18298 / 14222 / 5368
Регистрация: 17.03.2014
Сообщений: 28,900
Записей в блоге: 1
01.02.2015, 22:26
Цитата Сообщение от Lar4ik Посмотреть сообщение
потом я собираюсь сравнивать array и array1, array2, array3. Можно ли так делать?
Можно.

Цитата Сообщение от Lar4ik Посмотреть сообщение
Или подскажите в каком направлении идти
Пока направление верное. Единственное что можно уже улучшить так это следующий код:
C#
1
2
3
4
// преобразуем строку в байты <--- ЭТО НЕВЕРНЫЙ КОМЕННТАРИЙ. Никакого преобразования здесь нет. Только объявление и инициализация переменной.
byte[] array = new byte[fstream.Length];
// считываем данные
fstream.Read(array, 0, array.Length);
При таком подходе ты будешь читать весь файл целиком. А что если входной файл будет размером 5 Гб? На самом деле достаточно прочитать столько байтов сколько содержится в максимальной "магической последовательности".
1
3176 / 1935 / 312
Регистрация: 27.08.2010
Сообщений: 5,131
Записей в блоге: 1
02.02.2015, 03:39
Цитата Сообщение от Lar4ik Посмотреть сообщение
в каком направлении идти
В противоположном.
  • Взять список сигнатур из Offset file unzipper 0.3.5 от Luigi Auriemma
  • Открыть для себя алгоритм Aho-Corasick
1
Master of Orion
Эксперт .NET
 Аватар для Psilon
6102 / 4958 / 905
Регистрация: 10.07.2011
Сообщений: 14,522
Записей в блоге: 5
02.02.2015, 04:07
Лучший ответ Сообщение было отмечено Psilon как решение

Решение

C#
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
using System;
using System.Collections.Generic;
using System.IO;
using System.Linq;
 
namespace ConsoleApplication33
{
    class Program
    {
        static void Main(string[] args)
        {
            string path = @"C:\Users\Alex\Pictures\Slideshow\Bankoboev.Ru_u_ozera_hvoinyi_les.jpg";
            using (var stream = File.OpenRead(path))
            {
                string format = FileDeterminator.DetermineFormat(stream);
                Console.WriteLine(format);
            }
        }
    }
 
    public static class FileDeterminator
    {
        private static readonly Dictionary<string, byte[]> Formats = new Dictionary<string, byte[]>()
        {
            {"PNG", new byte[]{0x89, 0x50, 0x4E, 0x47, 0x0D, 0x0A, 0x1A, 0x0A, 0x00, 0x00, 0x00, 0x0D, 0x49, 0x48, 0x44, 0x52}},
            {"JPG", new byte[]{0xFF, 0xD8, 0xFF}},
            {"GIF", new byte[]{0x47, 0x49, 0x46, 0x38}}
        };
 
        public static ICollection<string> SupportedFormats 
        {
            get { return Formats.Keys; }
        }
 
        public static byte[] GetPrefix(string format)
        {
            return Formats[format];
        }
 
        public static string DetermineFormat(Stream stream)
        {
            stream.Position = 0;
            int length = (int) Math.Min(stream.Length, Formats.Max(f => f.Value.Length));
            byte[] bytes = new byte[length];
            stream.Read(bytes, 0, length);
            stream.Position = 0;
            foreach (var format in Formats)
            {
                if (HasPrefix(bytes, format.Value))
                    return format.Key;
            }
            return null;
        }
 
        private static bool HasPrefix(byte[] file, byte[] prefix)
        {
            if (prefix.Length > file.Length) 
                return false;
            for (int i = 0; i < prefix.Length; i++)
            {
                if (prefix[i] != file[i])
                    return false;
            }
            return true;
        }
    }
}
2
Надоела реклама? Зарегистрируйтесь и она исчезнет полностью.
raxper
Эксперт
30234 / 6612 / 1498
Регистрация: 28.12.2010
Сообщений: 21,154
Блог
02.02.2015, 04:07
Помогаю со студенческими работами здесь

Используя базовую последовательность из N=10 чисел получить последовательность
Используя базовую последовательность из N=10 чисел получить последовательность, имеющую показательное распределение с параметром (лямбда) =...

Найдите в последовательности самую большую магическую подпоследовательность
Даны N натуральных чисел. Найдите в нем самую большую магическую последовательность. Последовательность чисел называется магической, если...

Золотоискатель нашел магическую шахту с волшебником хранителем
Введите числа N и K Хранитель дает золотоискателю N попыток, забраться в шахту В шахте есть 10 уровней полных золота ...

Декодируем формат avi и запускаем двоичную последовательность
Где можно почитать эту инфу? инфу про декодирование форматов найти не проблема (но если есть что то полезное, то не откажусь!), а как вот...

Как исправить ошибку «Формат файла xls не соответствует разрешения файла»?
В общем задача такая: Создать на стороне пользователя средствами JS excel файл. Сразу оговорюсь, что на стороне сервера это сделать...


Искать еще темы с ответами

Или воспользуйтесь поиском по форуму:
4
Ответ Создать тему
Новые блоги и статьи
Оттенки серого
Argus19 18.03.2026
Оттенки серого Нашёл в интернете 3 прекрасных модуля: Модуль класса открытия диалога открытия/ сохранения файла на Win32 API; Модуль класса быстрого перекодирования цветного изображения в оттенки. . .
SDL3 для Desktop (MinGW): Рисуем цветные прямоугольники с помощью рисовальщика SDL3 на Си и C++
8Observer8 17.03.2026
Содержание блога Финальные проекты на Си и на C++: finish-rectangles-sdl3-c. zip finish-rectangles-sdl3-cpp. zip
Символические и жёсткие ссылки в Linux.
algri14 15.03.2026
Существует два типа ссылок — символические и жёсткие. Ссылка в Linux — это запись в каталоге, которая может указывать либо на inode «файла-ИСТОЧНИКА», тогда это будет «жёсткая ссылка» (hard link),. . .
[Owen Logic] Поддержание уровня воды в резервуаре количеством включённых насосов: моделирование и выбор регулятора
ФедосеевПавел 14.03.2026
Поддержание уровня воды в резервуаре количеством включённых насосов: моделирование и выбор регулятора ВВЕДЕНИЕ Выполняя задание на управление насосной группой заполнения резервуара,. . .
делаю науч статью по влиянию грибов на сукцессию
anaschu 13.03.2026
прикрепляю статью
SDL3 для Desktop (MinGW): Создаём пустое окно с нуля для 2D-графики на SDL3, Си и C++
8Observer8 10.03.2026
Содержание блога Финальные проекты на Си и на C++: hello-sdl3-c. zip hello-sdl3-cpp. zip Результат:
Установка CMake и MinGW 13.1 для сборки С и C++ приложений из консоли и из Qt Creator в EXE
8Observer8 10.03.2026
Содержание блога MinGW - это коллекция инструментов для сборки приложений в EXE. CMake - это система сборки приложений. Здесь описаны базовые шаги для старта программирования с помощью CMake и. . .
Как дизайн сайта влияет на конверсию: 7 решений, которые реально повышают заявки
Neotwalker 08.03.2026
Многие до сих пор воспринимают дизайн сайта как “красивую оболочку”. На практике всё иначе: дизайн напрямую влияет на то, оставит человек заявку или уйдёт через несколько секунд. Даже если у вас. . .
КиберФорум - форум программистов, компьютерный форум, программирование
Powered by vBulletin
Copyright ©2000 - 2026, CyberForum.ru