![]() |
Модераторы: xvr |
![]() ![]() ![]() |
|
Олечка85 |
|
|||
![]() Новичок Профиль Группа: Участник Сообщений: 15 Регистрация: 19.6.2006 Где: Berlin Репутация: нет Всего: нет |
Привет всем!
Такая проблема. Я считываю "магическое число" из файла, мне нужно сравнить его с имеющимися числами, чтобы определить тип данного файла. И то, что считалось.... ![]() Причем байты меняются местами ![]() Может, кто-нибудь имел с ними дело? Например: Тип файла - jpg, Должно получиться - FFD8FFE0, Считывается - E0FFD8FF или E1FFD8FF Тип файла - zip, Должно получиться - 504B0304, Считывается - 4034B50 Тип файла - class, Должно получиться - CAFEBABE, Считывается - BEBAFECA Тип файла - ps, Должно получиться - 2521, Считывается - 65422525 Тип файла - tiff, Должно получиться - 49492A00, Считывается - 2A4949 Тип файла - exe, Должно получиться - 7F454C46, Считывается - 464C457F ![]() ![]() ![]() Искала какую-нибудь инфу на эту тему, встретила 2 туманных упоминания о том, что "старший и младший байты обычно меняются".... ![]() И всё на этом. ![]() |
|||
|
||||
ptr |
|
|||
![]() Опытный ![]() ![]() Профиль Группа: Участник Сообщений: 661 Регистрация: 31.5.2006 Где: Новосибирск Репутация: нет Всего: 14 |
Оба варианта правильные. В первом случае интерперетируется по-отдельности как шестнадцатеричное число каждый из 4 байтов, а во-втором все четыре байта как одно число.
Для zip: 50 4B 03 04 - четыре байта(char) - четыре числа. 0x04034b50 - четыре байта(int) - одно число. Это сообщение отредактировал(а) ptr - 22.6.2006, 07:47 -------------------- Единственный способ определить границы возможного - это выйти за эти границы, в невозможное. Артур Кларк. |
|||
|
||||
kirjanov |
|
|||
![]() Опытный ![]() ![]() Профиль Группа: Участник Сообщений: 326 Регистрация: 22.1.2006 Где: Dark wood of erro r Репутация: 3 Всего: 15 |
Олечка85,
такой порядок байтов обусловлен архитектурой x86. А порядок определяется следующим правилом: младший байт по младшему адресу. Младший адрес начинается с правой стороны. Вот и посмотри на свой пример с jpg: FFD8FFE0 получается как E0FFD8FF => младший байт E0 по младшему адресу, т.е. первый, аналогично и другие И причем здесь unix? ![]() |
|||
|
||||
Олечка85 |
|
|||
![]() Новичок Профиль Группа: Участник Сообщений: 15 Регистрация: 19.6.2006 Где: Berlin Репутация: нет Всего: нет |
(растерянно) Ага... Спасибо...
А как мне можно из строки, где байты интерпретируются по отдельности, сделать строку, где как одно число? Очень даже "при том"! ![]() Я эту программу для Линукса пишу, и магические числа в файлах тоже там ищу! Это сообщение отредактировал(а) Олечка85 - 22.6.2006, 23:28 |
|||
|
||||
kirjanov |
|
|||
![]() Опытный ![]() ![]() Профиль Группа: Участник Сообщений: 326 Регистрация: 22.1.2006 Где: Dark wood of erro r Репутация: 3 Всего: 15 |
Олечка85,
так если тебе надо сравнить значение на "магическое число", зачем байты менять? |
|||
|
||||
bsa |
|
|||
![]() Эксперт ![]() ![]() ![]() ![]() Профиль Группа: Модератор Сообщений: 9185 Регистрация: 6.4.2006 Где: Москва, Россия Репутация: 16 Всего: 196 |
Олечка85
Тебе надо сравнивать не как числа, а как массив байт:
|
|||
|
||||
jonie |
|
|||
Эксперт ![]() ![]() ![]() ![]() Профиль Группа: Завсегдатай Сообщений: 5613 Регистрация: 21.8.2005 Где: Владимир Репутация: нет Всего: 118 |
гугли по словам LittleEndian и BigEndian..... в x86 первое в маках (если я не ошибаюсь) второе....а nix там реал не при чем. Так вот Intel показалось что круче... давно-давно).. хотя есть и объективные причины.
http://en.wikipedia.org/wiki/Bigendian -------------------- Что-то не поняли? -> Напейтесь до зеленых человечков... эта сверхцивилизация Вам поможет... |
|||
|
||||
bsa |
|
|||
![]() Эксперт ![]() ![]() ![]() ![]() Профиль Группа: Модератор Сообщений: 9185 Регистрация: 6.4.2006 Где: Москва, Россия Репутация: 16 Всего: 196 |
jonie, все можно. ;) Я бы перевернул. Но когда человек не знает даже как прочитать n байт из файла, то распинаться про LittleEndian и BigEndian, имхо, совершенно бесполезно. Пусть как можно быстрее напишет необходимую прогу, получит зачет и забудет, как страшный сон. ;)
Олечка85, пожалуйста извини, если сказанным выше обидел. ;) |
|||
|
||||
Олечка85 |
|
|||
![]() Новичок Профиль Группа: Участник Сообщений: 15 Регистрация: 19.6.2006 Где: Berlin Репутация: нет Всего: нет |
Ок, буду сравнивать как массив байт. Если получится. Вообще-то магическое число дано мне в виде "0хАААААААА", ну да ладно...
Спасибо за участие ![]() Да чего уж там... ![]() Это сообщение отредактировал(а) Олечка85 - 25.6.2006, 17:16 |
|||
|
||||
bilbobagginz |
|
|||
![]() Naughtius Maximus ![]() ![]() ![]() ![]() Профиль Группа: Экс. модератор Сообщений: 8813 Регистрация: 2.3.2004 Где: Israel Репутация: 4 Всего: 317 |
а пока, обижаться на самом деле нечего: стиснуть клювик, зажать в нём оливковую ветку и читать man read(). а потом шкодить, и побольше.
Это сообщение отредактировал(а) bilbobagginz - 25.6.2006, 18:30 -------------------- Я ещё не демон. Я только учусь. |
|||
|
||||
bsa |
|
|||
![]() Эксперт ![]() ![]() ![]() ![]() Профиль Группа: Модератор Сообщений: 9185 Регистрация: 6.4.2006 Где: Москва, Россия Репутация: 16 Всего: 196 |
Лучше читать man 2 read ![]() |
|||
|
||||
Олечка85 |
|
|||
![]() Новичок Профиль Группа: Участник Сообщений: 15 Регистрация: 19.6.2006 Где: Berlin Репутация: нет Всего: нет |
Всё, всё буду читать
![]() Всем спасибо за помощь! |
|||
|
||||
![]() ![]() ![]() |
Правила форума "С/С++: Программирование под Unix/Linux" | |
|
Если Вам понравилась атмосфера форума, заходите к нам чаще! С уважением, xvr. |
1 Пользователей читают эту тему (1 Гостей и 0 Скрытых Пользователей) | |
0 Пользователей: | |
« Предыдущая тема | C/C++: Программирование под Unix/Linux | Следующая тема » |
|
По вопросам размещения рекламы пишите на vladimir(sobaka)vingrad.ru
Отказ от ответственности Powered by Invision Power Board(R) 1.3 © 2003 IPS, Inc. |