Модераторы: xvr
  

Поиск:

Ответ в темуСоздание новой темы Создание опроса
> Магические числа в начале файла, Байты меняются местами??? 
V
    Опции темы
Олечка85
  Дата 21.6.2006, 20:13 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Новичок



Профиль
Группа: Участник
Сообщений: 15
Регистрация: 19.6.2006
Где: Berlin

Репутация: нет
Всего: нет



Привет всем!
Такая проблема.
Я считываю "магическое число" из файла, мне нужно сравнить его с имеющимися числами, чтобы определить тип данного файла.

И то, что считалось.... smile  оооочень похоже на то, что должно получиться, но НЕ ТО!
Причем байты меняются местами  smile  , и системы в этом я не вижу... а ведь она должна быть!

Может, кто-нибудь имел с ними дело?

Например:

Тип файла - jpg,    Должно получиться - FFD8FFE0, Считывается - E0FFD8FF или E1FFD8FF
Тип файла - zip,    Должно получиться - 504B0304, Считывается - 4034B50
Тип файла - class, Должно получиться - CAFEBABE, Считывается - BEBAFECA
Тип файла - ps,     Должно получиться - 2521,         Считывается - 65422525
Тип файла - tiff,     Должно получиться - 49492A00, Считывается - 2A4949
Тип файла - exe,   Должно получиться - 7F454C46, Считывается - 464C457F

 smile  smile  smile 

Искала какую-нибудь инфу на эту тему, встретила 2 туманных упоминания о том, что "старший и младший байты обычно меняются".... smile  

И всё на этом.  smile  
PM MAIL ICQ   Вверх
ptr
Дата 22.6.2006, 07:26 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Опытный
**


Профиль
Группа: Участник
Сообщений: 661
Регистрация: 31.5.2006
Где: Новосибирск

Репутация: нет
Всего: 14



Оба варианта правильные. В первом случае интерперетируется по-отдельности как шестнадцатеричное число каждый из 4 байтов, а во-втором все четыре байта как одно число.

Для zip: 
50 4B 03 04 - четыре байта(char) - четыре числа.
0x04034b50 - четыре байта(int) - одно число.    

Это сообщение отредактировал(а) ptr - 22.6.2006, 07:47


--------------------
Единственный способ определить границы возможного - это выйти за эти границы, в невозможное.
Артур Кларк.
PM MAIL ICQ   Вверх
kirjanov
Дата 22.6.2006, 09:45 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Опытный
**


Профиль
Группа: Участник
Сообщений: 326
Регистрация: 22.1.2006
Где: Dark wood of erro r

Репутация: 3
Всего: 15



Олечка85

такой порядок байтов обусловлен архитектурой  x86. А порядок определяется следующим правилом: младший байт по младшему адресу. Младший адрес начинается с правой стороны. Вот и посмотри на свой пример с jpg:  FFD8FFE0 получается как E0FFD8FF => младший байт E0 по младшему адресу, т.е. первый, аналогично и другие

И причем здесь unix? smile  
PM MAIL   Вверх
Олечка85
Дата 22.6.2006, 23:28 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Новичок



Профиль
Группа: Участник
Сообщений: 15
Регистрация: 19.6.2006
Где: Berlin

Репутация: нет
Всего: нет



(растерянно) Ага... Спасибо...
А как мне можно из строки, где байты интерпретируются по отдельности, сделать строку, где как одно число?


Цитата(kirjanov @  22.6.2006,  09:45 Найти цитируемый пост)
И причем здесь unix? smile   

Очень даже "при том"!  smile 
Я эту программу для Линукса пишу, и магические числа в файлах тоже там ищу!
  

Это сообщение отредактировал(а) Олечка85 - 22.6.2006, 23:28
PM MAIL ICQ   Вверх
kirjanov
Дата 23.6.2006, 22:01 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Опытный
**


Профиль
Группа: Участник
Сообщений: 326
Регистрация: 22.1.2006
Где: Dark wood of erro r

Репутация: 3
Всего: 15



Олечка85
так если тебе надо сравнить значение на "магическое число", зачем байты менять? 
PM MAIL   Вверх
bsa
Дата 24.6.2006, 13:38 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Эксперт
****


Профиль
Группа: Модератор
Сообщений: 9185
Регистрация: 6.4.2006
Где: Москва, Россия

Репутация: 16
Всего: 196



Олечка85
Тебе надо сравнивать не как числа, а как массив байт:
Код
...
char zip_magic[] = { 0x50, 0x4B, 0x03, 0x04 };
char * buffer;
buffer = (char*)malloc( sizeof(zip_magic) );
read( fd, buffer, sizeof(zip_magic) );
if ( memcmp( buffer, zip_magic, sizeof( zip_magic ) ) == 0 ) {
       //число magic совпало
}
...

 
PM   Вверх
jonie
Дата 25.6.2006, 02:51 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Эксперт
****


Профиль
Группа: Завсегдатай
Сообщений: 5613
Регистрация: 21.8.2005
Где: Владимир

Репутация: нет
Всего: 118



гугли по словам LittleEndian и BigEndian..... в x86 первое в маках (если я не ошибаюсь) второе....а nix там реал не при чем. Так вот Intel показалось что круче... давно-давно).. хотя есть и объективные причины.
Цитата

Тебе надо сравнивать не как числа, а как массив байт
....
а почему нельзя сравнивать "магические" числа ?? ну переверните их для себя... и напишите "только для архитектуры LittleEndian" в README )...

http://en.wikipedia.org/wiki/Bigendian 


--------------------
Что-то не поняли? -> Напейтесь до зеленых человечков... эта сверхцивилизация Вам поможет...
PM MAIL Jabber   Вверх
bsa
Дата 25.6.2006, 11:42 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Эксперт
****


Профиль
Группа: Модератор
Сообщений: 9185
Регистрация: 6.4.2006
Где: Москва, Россия

Репутация: 16
Всего: 196



jonie, все можно. ;) Я бы перевернул. Но когда человек не знает даже как прочитать n байт из файла, то распинаться про LittleEndian и BigEndian, имхо, совершенно бесполезно. Пусть как можно быстрее напишет необходимую прогу, получит зачет и забудет, как страшный сон. ;)

Олечка85, пожалуйста извини, если сказанным выше обидел. ;) 
PM   Вверх
Олечка85
Дата 25.6.2006, 17:14 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Новичок



Профиль
Группа: Участник
Сообщений: 15
Регистрация: 19.6.2006
Где: Berlin

Репутация: нет
Всего: нет



Ок, буду сравнивать как массив байт. Если получится. Вообще-то магическое число дано мне в виде "0хАААААААА", ну да ладно...

Спасибо за участие  smile 

Цитата(bsa @  25.6.2006,  11:42 Найти цитируемый пост)
если сказанным выше обидел

Да чего уж там...  smile  Я вообще-то не совсем "ноль", но в С++ - очень близко к тому... Надеюсь, всё когда-нибудь изменится, а пока - на что уж тут обижаться?
  

Это сообщение отредактировал(а) Олечка85 - 25.6.2006, 17:16
PM MAIL ICQ   Вверх
bilbobagginz
Дата 25.6.2006, 18:23 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Naughtius Maximus
****


Профиль
Группа: Экс. модератор
Сообщений: 8813
Регистрация: 2.3.2004
Где: Israel

Репутация: 4
Всего: 317



а пока, обижаться на самом деле нечего: стиснуть клювик, зажать в нём оливковую ветку и читать man read(). а потом шкодить, и побольше.


  

Это сообщение отредактировал(а) bilbobagginz - 25.6.2006, 18:30


--------------------
Я ещё не демон. Я только учусь.
PM WWW   Вверх
bsa
Дата 25.6.2006, 23:22 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Эксперт
****


Профиль
Группа: Модератор
Сообщений: 9185
Регистрация: 6.4.2006
Где: Москва, Россия

Репутация: 16
Всего: 196



Цитата(bilbobagginz @ 25.6.2006,  18:23)
а пока, обижаться на самом деле нечего: стиснуть клювик, зажать в нём оливковую ветку и читать man read(). а потом шкодить, и побольше.

Лучше читать man 2 read smile 
PM   Вверх
Олечка85
Дата 26.6.2006, 18:51 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Новичок



Профиль
Группа: Участник
Сообщений: 15
Регистрация: 19.6.2006
Где: Berlin

Репутация: нет
Всего: нет



Всё, всё буду читать  smile  Уже иду.
Всем спасибо за помощь! 
PM MAIL ICQ   Вверх
  
Ответ в темуСоздание новой темы Создание опроса
Правила форума "С/С++: Программирование под Unix/Linux"
xvr
  • Проставьте несколько ключевых слов темы, чтобы её можно было легче найти.
  • Не забывайте пользоваться кнопкой "Код".
  • Вопросы мобильной разработки тут
  • Телепатов на форуме нет! Задавайте чёткий, конкретный и полный вопрос. Указывайте полностью ошибки компилятора и компоновщика.
  • Новое сообщение должно иметь прямое отношение к разделу форума. Флуд, флейм, оффтопик запрещены.
  • Категорически запрещается обсуждение вареза, "кряков", взлома программ и т.д.

Если Вам понравилась атмосфера форума, заходите к нам чаще! С уважением, xvr.

 
 
1 Пользователей читают эту тему (1 Гостей и 0 Скрытых Пользователей)
0 Пользователей:
« Предыдущая тема | C/C++: Программирование под Unix/Linux | Следующая тема »


 




[ Время генерации скрипта: 0.0944 ]   [ Использовано запросов: 21 ]   [ GZIP включён ]


Реклама на сайте     Информационное спонсорство

 
По вопросам размещения рекламы пишите на vladimir(sobaka)vingrad.ru
Отказ от ответственности     Powered by Invision Power Board(R) 1.3 © 2003  IPS, Inc.