|
|
Регистрация Восстановить пароль |
Повторная активизация e-mail |
Регистрация | Задать вопрос |
Заплачу за решение |
Новые сообщения |
Сообщения за день |
Расширенный поиск |
Правила |
Всё прочитано |
|
|
Опции темы | Поиск в этой теме |
27.05.2012, 17:48 | #1 | ||
В стагнации
Участник клуба
Регистрация: 29.07.2011
Сообщений: 1,303
|
Чтение BMP-файла "руками" [Cи]
Есть задача с помощью средств самого Си считать монохромный BMP-файл размером 320x240 (9600 байт). Естественно я сразу полез на Википедию, дабы узнать как устроен формат.
Итак, собственно вопрос: при попытке считать первую же структуру BITMAPFILEHEADER из файла получается фэйл. Вот текст самой программы. Код:
Цитата:
Цитата:
E-mail: pashaworking@gmail.com | ICQ: 479914426 | Skype: moondearr
Понять, чего от тебя требует заказчик – это уже половина всей работы, а иногда и полностью выполненное задание. Последний раз редактировалось MooNDeaR; 27.05.2012 в 21:55. |
||
27.05.2012, 19:42 | #2 |
Старожил
Регистрация: 08.04.2012
Сообщений: 3,229
|
На С не пишу, так что сразу прошу извинить за, возможно, глупые вопросы.
Взял первый попавшийся BMP-файл и заглянул в него HEX-редактором - все правильно, значение 36h, т.е. 54 - как и положено. Может, объявленная Вами структура имеет выравнивание на 4 байта? Прочитайте первые 14 байт побайтно и выведите результат. PS. Честно говоря, я первые 14 байт при чтении всегда пропускаю - в них все равно нет ничего интересного. PPS. Да, еще, выведите размер структуры. На Паскале это было бы sizeof(bmpheader), как на С - не знаю, может, так же. Последний раз редактировалось s-andriano; 27.05.2012 в 19:46. |
27.05.2012, 20:03 | #3 |
В стагнации
Участник клуба
Регистрация: 29.07.2011
Сообщений: 1,303
|
Не знаю где глюк, наверное в википедии, но после замены структуры на такой вид:
Код:
E-mail: pashaworking@gmail.com | ICQ: 479914426 | Skype: moondearr
Понять, чего от тебя требует заказчик – это уже половина всей работы, а иногда и полностью выполненное задание. |
27.05.2012, 20:57 | #4 |
Старожил
Регистрация: 08.04.2012
Сообщений: 3,229
|
Повторю свою рекомендацию выяснить размер структуры. Если она окажется равной 18, а не 14 байтам - дело в выравнивании.
Я рекомендую все-таки разобраться с этим, потому что после заголовка файла будет заголовок изображения, в котором тоже чередуются поля разного размера. |
27.05.2012, 21:52 | #5 | |
В стагнации
Участник клуба
Регистрация: 29.07.2011
Сообщений: 1,303
|
Узнал размер структуры. Она выравнивается до 16 байт. Что всё равно не объясняет кривое считывание первых данных, ведь теоретически выравнивание дописывает байты к концу структуры, что испортило бы мне считывание следующей структуры BITMAPINFOHEADER, но никак не Хедера.
Нашел причину в кривой работе функции fread(). Она ОЧЕНЬ странно как-то считает данные. Не более двух байт за раз. Получаются вот такие перлы: Есть последовательность байтов: 00000000 00000000 00000000 00101000 (число 40 в формате ulong) Если записать структуру так: Код:
Код:
НО! Вот если эту же структуру записать так: Код:
Цитата:
Что за шутки я не знаю, и понятия пока не имею как правильно это обходить P.S. Посмотрел на всё это дело из HEX-редактора. Все числа оказывается записаны с конца, т.е. от младшего байта, к старшему. Т.е. поледовательность: Код:
Код:
Тобишь, согласно Википедии порядок байтов идет как Little-endian. Тогда мне вообще непонятен принцип работы функции fread()...
E-mail: pashaworking@gmail.com | ICQ: 479914426 | Skype: moondearr
Понять, чего от тебя требует заказчик – это уже половина всей работы, а иногда и полностью выполненное задание. Последний раз редактировалось MooNDeaR; 27.05.2012 в 22:11. |
|
27.05.2012, 22:12 | #6 |
Старожил
Регистрация: 17.11.2010
Сообщений: 18,922
|
Физически 40 для long на диске записано так: 00101000 00000000 00000000 00000000
при правильном чтении должно получится так: 00000000 00000000 00000000 00101000 т.е. слова меняются местами и внутри слов байты меняются местами. 100% проблемы выравнивания. На Си не пишу поэтому дальше пас. Хотя слышал о директиве препроцессора #pragma. Может в эту сторону копнуть? Могу еще ссылочку подкинуть http://jenyay.net/Programming/Bmp
Если бы архитекторы строили здания так, как программисты пишут программы, то первый залетевший дятел разрушил бы цивилизацию
Последний раз редактировалось Аватар; 27.05.2012 в 22:20. |
27.05.2012, 22:21 | #7 | ||
В стагнации
Участник клуба
Регистрация: 29.07.2011
Сообщений: 1,303
|
Цитата:
00000000 00101000 00000000 00000000 Т.е. функция fread() сначала правильно считывает первые 2 байта (переворачивает), затем вторые 2 байта и тоже переворачивает дописывая к концу типа unsigned long совсем не в тему эти нули, хотя надо было бы их дописывать к началу числа. Цитата:
E-mail: pashaworking@gmail.com | ICQ: 479914426 | Skype: moondearr
Понять, чего от тебя требует заказчик – это уже половина всей работы, а иногда и полностью выполненное задание. |
||
27.05.2012, 22:25 | #8 | |
Старожил
Регистрация: 17.11.2010
Сообщений: 18,922
|
Цитата:
Если бы архитекторы строили здания так, как программисты пишут программы, то первый залетевший дятел разрушил бы цивилизацию
|
|
27.05.2012, 22:33 | #9 |
В стагнации
Участник клуба
Регистрация: 29.07.2011
Сообщений: 1,303
|
Спасибо за совет про директиву #pragma.
Решил проблему вот таким образом: Код:
E-mail: pashaworking@gmail.com | ICQ: 479914426 | Skype: moondearr
Понять, чего от тебя требует заказчик – это уже половина всей работы, а иногда и полностью выполненное задание. Последний раз редактировалось MooNDeaR; 27.05.2012 в 23:07. |
27.05.2012, 23:37 | #10 | |
Старожил
Регистрация: 08.04.2012
Сообщений: 3,229
|
Цитата:
Ничто ни с чем не меняется, все как было, так и остается. |
|
|
Похожие темы | ||||
Тема | Автор | Раздел | Ответов | Последнее сообщение |
Натолкните на алгоритм или "Ночной город своими руками" | Karp_13 | Общие вопросы C/C++ | 18 | 12.03.2012 01:05 |
чтение и отображение из ".txt" файла в dataGridView | Leva_89 | C# (си шарп) | 0 | 23.03.2011 23:23 |
Чтение из ZIP-файла "на лету" (и ещё BASS/BASSMOD) | Wanderer_r | Мультимедиа в Delphi | 3 | 20.03.2010 21:14 |
Считывание строк из файла. перемещение по строкам "веред"-"назад" | Larkin. | Помощь студентам | 2 | 15.06.2009 17:58 |
"Hide Folder" своими руками (Delphi) | Air | Помощь студентам | 3 | 13.11.2008 03:38 |