![]() |
|
|
![]()
|
|
| heavix |
|
|||
|
Шустрый ![]() Профиль Группа: Участник Сообщений: 60 Регистрация: 10.8.2007 Репутация: нет Всего: нет |
Доброго времени суток господа...
Разбирая некоторый недокументированный бинарный формат файла натолкнулся на проблемку: подсчета контрольной суммы. Файл состоит из неких блоков данных... Однозначно определены границы этих болоков... предпоследняя запись - это некая контрольная сумма... Известно что она равна сумме сумм каждого четвертого байта в блоке (начиная с первого байта)... у меня задача - удалять некоторые блоки этого файла, при этом сохранив его жизнеспособность... но оказалось, что в зависимости от объема блока эта контрольная сумма для каждого блока может отличатся на 0xFD... Причем это константа для разных блоков! Вопрос у меня следующий: может это какой-то известный алгоритм подсчета контрольных сумм, и в чем собственно смысл этого числа 0xfd? Уважаемые господа прошу хоть каких-нибудь логических мыслей на тему возможного подсчета CRC... Заранее благодарен всем откликнувшимся! ))) |
|||
|
||||
| voral |
|
||||||||||
|
Бывалый ![]() Профиль Группа: Участник Сообщений: 158 Регистрация: 16.3.2008 Где: Иваново Репутация: нет Всего: нет |
А что странного. Вот алгоритм который я встречал в нескольких гостированных протоколах. На примерах
1 блок (для упрощения два байта)
Сумма (0xF2+0x12)&0xFF = 0x04 второй блок данных
Сумма (0x02+0x02)&0xFF = 0x04 А может быть в первом блоке несколько бай дающих ту же сумму. А может последний байт или слово вообще размер блока........ Добавлено через 9 минут и 41 секунду
На сколько вы в этом уверены? (Просто у меня (у клиентов) переодически возникали ситуации когда в огромном списке фин. операций нарисовывался небаланс с точностью до копейки похожий на одну из сумм... Потом выяснялось, что это всего лишь совпадение.
Так вы ж удаляете целый блок. При этом исправляются другие? Или вам надо часть блока удалить/заменить?
Тут бы с примерами. Т.е. если размер другой то она не FD если такой же то FD? |
||||||||||
|
|||||||||||
| heavix |
|
||||
|
Шустрый ![]() Профиль Группа: Участник Сообщений: 60 Регистрация: 10.8.2007 Репутация: нет Всего: нет |
Уверен, на 100%... Для программы которая работает с этим форматов файлов, я создавал условия при которых в блоки записывалась известная мне информация. Я создал ситуацию когда, в выходном файле получалась 1,2,3 записи блоков, нашел все смещения к каждой записи в блоке, определил поля, и порядки для чтения байтов каждой записи... Остались предпоследние 4 байта, которые, для любых размеров блоков,и количества записей в блоке, всегда равны сумме сумм каждого 4-го байта для записи +/- n*0xfd . То есть я предполагаю, что в определенной ситуации когда суммируются 4-е байты для записи по какому-то критерию определяется нужно из этой суммы вычесть 0xFD или нет... Для некоторого количества записей и получается n*0xFD. Но должен быть какой то логический смысл во всем этом! И я его никак не могу разглядеть! Возможно это делается для того, чтобы определить было ли переполнение при подсчете суммы блока... или что-то в этом духе. Мне интерестно почему именно число 0xFD. Возможно у этого числа есть какието важные свойства. Когда я говорил что удаляю блоки - я удаляю конкретные блоки, которые маркируются сигнатурой начала и конца блока, размеры блоков определены в заголовке... На выходе я получаю такойже файл, такого же размера, как и после удаления информации при помощи самой программы использующей даный формат файла. Отличие только в 4-х байтах контрольной суммы. Моя задача - просто написать библиотечку для возможности удаления этих записей! Готов сейчас пробовать любые, даже самые невероятные варианты - уже 3 дня сижу в hex редакторе и пытаюсь уловить закономерность, но пока безуспешно( |
||||
|
|||||
| voral |
|
|||
|
Бывалый ![]() Профиль Группа: Участник Сообщений: 158 Регистрация: 16.3.2008 Где: Иваново Репутация: нет Всего: нет |
что то я малость потерялся:
1 Эта контрольная сумма одна на весь файл ли существует в каждом блоке? 2 Что значит сумма сумм каждого 4-го байта. Это просто сложение каждого четвертого байта (начиная с первого)? 3 n*0xfd - что такое n? И почему оно умножается на 0xfd? PS трудно гадать в слепую |
|||
|
||||
| heavix |
|
||||
|
Шустрый ![]() Профиль Группа: Участник Сообщений: 60 Регистрация: 10.8.2007 Репутация: нет Всего: нет |
- контрольная сумма представляет собой сумму контрольных сумм для каждого блока
- контрольная сумма считается для каждого блока путем суммирования каждого 4-го байта начиная с 1-го. - из контрольной суммы для блока вычитается 0xFD если размер блока кратен 4 - собственно то чего я так долго не мог понять... Спасибо за участие))) Вопрос успешно решен) Это сообщение отредактировал(а) heavix - 19.8.2011, 13:23 |
||||
|
|||||
![]()
|
| Правила форума "Алгоритмы" | |
|
|
Форум "Алгоритмы" предназначен для обсуждения вопросов, связанных только с алгоритмами и структурами данных, без привязки к конкретному языку программирования и/или программному продукту.
Если Вам понравилась атмосфера форума, заходите к нам чаще! С уважением, maxim1000. |
| 0 Пользователей читают эту тему (0 Гостей и 0 Скрытых Пользователей) | |
| 0 Пользователей: | |
| « Предыдущая тема | Алгоритмы | Следующая тема » |
|
|
По вопросам размещения рекламы пишите на vladimir(sobaka)vingrad.ru
Отказ от ответственности Powered by Invision Power Board(R) 1.3 © 2003 IPS, Inc. |