![]() |
|
Модераторы: 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. |
| 0 Пользователей читают эту тему (0 Гостей и 0 Скрытых Пользователей) | |
| 0 Пользователей: | |
| « Предыдущая тема | C/C++: Программирование под Unix/Linux | Следующая тема » |
|
|
По вопросам размещения рекламы пишите на vladimir(sobaka)vingrad.ru
Отказ от ответственности Powered by Invision Power Board(R) 1.3 © 2003 IPS, Inc. |