Форум программистов
 

Восстановите пароль или Зарегистрируйтесь на форуме, о проблемах и с заказом рекламы пишите сюда - alarforum@yandex.ru, проверяйте папку спам!

Вернуться   Форум программистов > IT форум > Помощь студентам
Регистрация

Восстановить пароль
Повторная активизация e-mail

Купить рекламу на форуме - 42 тыс руб за месяц

Закрытая тема
Ваша тема закрыта, почему это могло произойти? Возможно,
Нет наработок или кода, если нужно готовое решение - создайте тему в разделе Фриланс и оплатите работу.
Название темы включает слова - "Помогите", "Нужна помощь", "Срочно", "Пожалуйста".
Название темы слишком короткое или не отражает сути вашего вопроса.
Тема исчерпала себя, помните, один вопрос - одна тема
Прочитайте правила и заново правильно создайте тему.
 
Опции темы Поиск в этой теме
Старый 04.08.2015, 21:39   #1
KBO
Форумчанин
 
Регистрация: 11.06.2010
Сообщений: 525
По умолчанию Неправильно определяется заголовок графического файла (Delphi)

Доброе время суток,
побегав по форумам, я нашел как определяют тип файлов, исходя из содержания самого файла.
Например файл «JPEG» сделанный редактором MSPaint, в заголовке содержит (первые 9б): «яШяа..JFIF»
Код определяет этот файл
Код:
	
var
  p: PChar;
begin
  Result := 0;
  if not Assigned(AStreamFile) then
    Exit;
  GetMem(p, 10);
…
if (p[6] = #74)
      and (p[7] = #70)
      and (p[8] = #73)
      and (p[9] = #70)  then
begin
   ATypeImage := 'jpg';
   Result := 3;
end;
 …
А вот есть программа ACDSee, которая конвертирует файлы в «JPEG» с заголовком «яШяб.ТЕxif».
Чтоб использовать вышеприведенный код, мне нужно добавить:
Код:
	or (p[6] = #69)//for ACDSee
      and (p[7] = #88)
      and (p[8] = #73)
      and (p[9] = #70)
ну, если исходить из заголовка файла.
Ну не тут то было. Это не работает,
А работает:
Код:
or (p[6] = #69)  //for ACDSee
      and (p[7] = #120)
      and (p[8] = #105)
      and (p[9] = #102)
Я не пойму, откуда берутся эти кода клавиш: «Е», «F9», «9», «6», в этих регистрах?

Заранее спасибо
KBO вне форума
Старый 04.08.2015, 22:14   #2
JUDAS
фонатик DELPHI
Форумчанин
 
Аватар для JUDAS
 
Регистрация: 14.01.2008
Сообщений: 714
По умолчанию

Цитата:
Сообщение от KBO Посмотреть сообщение
Доброе время суток,
побегав по форумам
автор, не по тем форумам бегаешь.

Цитата:
Сообщение от KBO Посмотреть сообщение
я нашел как определяют тип файлов, исходя из с
неправильное утверждение. Их нашли задолго до твоего и моего рождения.
То , что ты описал называется определение типа файла по сигнатуре
вот полный перечень сигнатур и соответствующих им типов файлов
http://www.filesignatures.net/index....er=EXT&alpha=J


и ещё, я тебе со слезами на глазах прошу не пиши пожалуйста так код на паскале
Цитата:
var
p: PChar;
begin
Result := 0;
if not Assigned(AStreamFile) then
Exit;
GetMem(p, 10);

if (p[6] = #74)
and (p[7] = #70)
and (p[8] = #73)
and (p[9] = #70) then
begin
ATypeImage := 'jpg';
Result := 3;
end;
вот тебе кусок кода, вклинь себе куда надо и используй пожалуйста

Код:
function FileTypeBySignature(const FileName : string) : string;
var stream : TFileStream;
    buff   : int64; // 8-ми байт достаточно с головой
begin
  result := ''; // нет никакого типа
  if not FileExists(FileName) then exit;
  buff := 0;
  stream := TFileStream.Create(FileName, fmOpenRead or fmShareDenyRead);
  stream.Read(buff, sizeof(buff));
  stream.Free;
  case (buff and $FFFFFFFF) of
    $E0FFD8FF : result := 'JPEG IMAGE';
    $E2FFD8FF : result := 'JPEG CANNON EOS JPEG FILE';
    $E3FFD8FF : result := 'JPEG SAMSUNG D500 JPEG FILE';
    $E1FFD8FF : result := 'JPEG Digital camera JPG (EXIF)';
    $E8FFD8FF : result := 'JPEG Still Picture Interchange (SPIFF)';
    // ...  и так далее
  end;
end;
95% сбоев и ошибок приложений, находится в полу метрах от монитора

Последний раз редактировалось JUDAS; 04.08.2015 в 23:49.
JUDAS вне форума
Старый 05.08.2015, 02:27   #3
KBO
Форумчанин
 
Регистрация: 11.06.2010
Сообщений: 525
По умолчанию

Спасибо >>JUDAS
помогло.

извиняюсь за безтактность, но мне не понятна следующее:
вот мы прочитали 8 байт в переменную "buff":
Код:
stream.Read(buff, sizeof(buff));
1) как работает следующая скобка:
Код:
(buff and $FFFFFFFF)
???

2) и почему нужно переставлять регистры, например: "FF D8 FF E8" (на вышеуказанном сайте) в "E8FFD8FF"?

Последний раз редактировалось Stilet; 05.08.2015 в 08:28.
KBO вне форума
Старый 05.08.2015, 07:40   #4
p51x
Старожил
 
Регистрация: 15.02.2010
Сообщений: 15,695
По умолчанию

Цитата:
как работает следующая скобка
знакомимся с битовыми операциями, например: https://ru.wikipedia.org/wiki/%D0%91...86%D0%B8%D0%B8

Цитата:
и почему нужно переставлять регистры, например: "FF D8 FF E8" (на вышеуказанном сайте) в "E8FFD8FF"?
не регистры, а байты в памяти. читайте: https://ru.wikipedia.org/wiki/%D0%9F...82%D0%BE%D0%B2

П.С. У jpeg сигнатура в пару байт, а дальше уже служебная инфа
p51x вне форума
Старый 05.08.2015, 08:36   #5
JUDAS
фонатик DELPHI
Форумчанин
 
Аватар для JUDAS
 
Регистрация: 14.01.2008
Сообщений: 714
По умолчанию

Уважаемый p51x, если бы все курили мануалы то существование этого и других форумов было бы излишнее.
п.с. сам не люблю читать. мой метод - "бери и пиши по живому".

Цитата:
Сообщение от KBO Посмотреть сообщение
1) как работает следующая скобка:
Код:
(buff and $FFFFFFFF)
автор, смотри. Мы читаем 8 байт а анализируем только 4. Чтобы было наглядно и понятно поясню в десятичной системе счисления.

допустм, мы закодировали 150 типов файлов числами от 1 до 150. Анализируемые нами типы файлов находятся в первой сотне. В таком случае для анализа мне нужно отбросить вторую сотню
if X>99 then X = X - 100
а результат X пропускать case
то же и тут. считано 8 байт, а нам нужно анализировать первые 4, поэтому старшие 4 нужно "занулить". Операция and "оставляет" те биты которые указаны во втором операнде, всё остальное онуляется.
Пример buff = $0102030405060708 and $FFFFFFFF =
------------------
$0102030405060708
$00000000FFFFFFFF
-------------------
$0000000005060708

Как то так....

Цитата:
Сообщение от KBO Посмотреть сообщение
2) и почему нужно переставлять регистры, например: "FF D8 FF E8" (на вышеуказанном сайте) в "E8FFD8FF"?
не только первый !



Сигнатуры в справочниках и на сайте по ссылке выше, указываются в порядке расположения в памяти, то есть наоборот. Если у нас 4 байта, то 1-й байт = 4-му, а 2-й байт 3-му.
ВОт и нужно "выворачивать" сигнатуру перед анализом.
95% сбоев и ошибок приложений, находится в полу метрах от монитора

Последний раз редактировалось JUDAS; 05.08.2015 в 08:45.
JUDAS вне форума
Старый 05.08.2015, 10:53   #6
Stilet
Белик Виталий :)
Старожил
 
Аватар для Stilet
 
Регистрация: 23.07.2007
Сообщений: 57,792
По умолчанию

Цитата:
почему нужно переставлять регистры
Ну эт такая необходимость повседневна. Младший байт самый первый, потом считывается старший и так далее.
Цитата:
Порядок от младшего к старшему или (англ. little-endian, дословно: «остроконечный», о происхождении термина ниже): A_0,\dots,A_n, запись начинается с младшего и заканчивается старшим. Этот порядок записи принят в памяти персональных компьютеров с x86-процессорами, в связи с чем иногда его называют интеловский порядок байт (по названию фирмы-создателя архитектуры x86). В некоторых кругах используется название англ. VAX order, например, в документации Perl[1].

В противоположность порядку «от старшего к младшему» (англ. big-endian, «тупоконечный»), соглашение little-endian поддерживают меньше кросс-платформенных протоколов и форматов данных; существенные исключения: USB, конфигурация PCI, таблица разделов GUID, рекомендации FidoNet.
Так что тут все как надо - зеркально читать приходится, если глазами смотреть.
I'm learning to live...
Stilet вне форума
Старый 05.08.2015, 11:38   #7
f.hump
C/C++, Asm
Участник клуба
 
Аватар для f.hump
 
Регистрация: 02.03.2010
Сообщений: 1,323
По умолчанию

кстати, Exif/Jfif заголовки могут быть не только в jpeg, и что более интересно являются опциональными во всех случаях (картинка может обойтись и без них).

Цитата:
FF D8 FF E8
FF D8 - начало jpeg
FF E0, FF E1 .. FF E8 .. FF EE, FF EF - application specific info

Последний раз редактировалось f.hump; 05.08.2015 в 11:41.
f.hump вне форума
Старый 05.08.2015, 11:43   #8
JUDAS
фонатик DELPHI
Форумчанин
 
Аватар для JUDAS
 
Регистрация: 14.01.2008
Сообщений: 714
По умолчанию

Цитата:
Сообщение от f.hump Посмотреть сообщение
FF D8 - начало jpeg
FF E0, FF E1 .. FF E8 .. FF EE, FF EF - application specific info
не вводите человека в заблуждение и прочитайте вот это
http://www.filesignatures.net/index....er=EXT&alpha=J

начало jpeg FF D8 FF E*
где * - подвид JPEG
95% сбоев и ошибок приложений, находится в полу метрах от монитора
JUDAS вне форума
Старый 05.08.2015, 11:51   #9
f.hump
C/C++, Asm
Участник клуба
 
Аватар для f.hump
 
Регистрация: 02.03.2010
Сообщений: 1,323
По умолчанию

никого я в заблуждение не ввожу, потому что стандандарт CCITT - T.81 знаю практически на память.

а подвид определяется маркерами
FF C0, FF C1, FF C2, FF C3, FF C5, FF C6, FF C7 .. FF CF

Последний раз редактировалось f.hump; 05.08.2015 в 11:54.
f.hump вне форума
Старый 05.08.2015, 13:12   #10
JUDAS
фонатик DELPHI
Форумчанин
 
Аватар для JUDAS
 
Регистрация: 14.01.2008
Сообщений: 714
По умолчанию

Цитата:
Сообщение от f.hump Посмотреть сообщение
никого я в заблуждение не ввожу, потому что стандандарт CCITT - T.81 знаю практически на память.

а подвид определяется маркерами
FF C0, FF C1, FF C2, FF C3, FF C5, FF C6, FF C7 .. FF CF
Вы вообще о чём речь ведёте? название темы читали?

для информации, в сигнатурах рисунка формата JPEG JPG нет ни одного байта который начинается на C7 . Видимо Вы попутали стандарты
95% сбоев и ошибок приложений, находится в полу метрах от монитора
JUDAS вне форума
Закрытая тема


Купить рекламу на форуме - 42 тыс руб за месяц

Опции темы Поиск в этой теме
Поиск в этой теме:

Расширенный поиск


Похожие темы
Тема Автор Раздел Ответов Последнее сообщение
Неправильно определяется ширина окна браузера AlexKain JavaScript, Ajax 8 11.06.2016 17:13
Неправильно определяется отступ слева justfor JavaScript, Ajax 2 25.02.2015 10:37
Отображение графического файла в Xlib Fataller Общие вопросы C/C++ 0 07.07.2011 16:17
вывод графического файла на екран nikita765 Assembler - Ассемблер (FASM, MASM, WASM, NASM, GoASM, Gas, RosAsm, HLA) и не рекомендуем TASM 2 06.12.2010 17:39
Почему не определяется конец файла? nazavrik Общие вопросы C/C++ 3 17.06.2009 20:53