Поиск:

Ответ в темуСоздание новой темы Создание опроса
> Алгоритм CRC и магическое число 0xFD, подсчет CRC 
V
    Опции темы
heavix
Дата 16.8.2011, 11:50 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Шустрый
*


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

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



Доброго времени суток господа... 
Разбирая некоторый недокументированный  бинарный формат файла натолкнулся на проблемку: подсчета контрольной суммы. 
Файл состоит из неких блоков данных... Однозначно определены границы этих болоков...
предпоследняя запись - это некая контрольная сумма... Известно что она равна сумме сумм каждого четвертого байта в блоке (начиная с первого байта)...
у меня задача - удалять некоторые блоки этого файла, при этом сохранив его жизнеспособность... но оказалось, что в зависимости от объема блока эта 
контрольная сумма для каждого блока может отличатся на 0xFD... Причем это константа для разных блоков! 
Вопрос у меня следующий: может это какой-то известный алгоритм подсчета контрольных сумм, и в чем собственно смысл этого числа 0xfd?
Уважаемые господа прошу хоть каких-нибудь логических мыслей на тему возможного подсчета CRC... 
Заранее благодарен всем откликнувшимся! ))) 
PM MAIL   Вверх
voral
Дата 16.8.2011, 13:34 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Бывалый
*


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

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



А что странного. Вот алгоритм который я встречал в нескольких гостированных протоколах. На примерах
1 блок (для упрощения два байта)
Цитата

0xF2
0x12

Сумма  (0xF2+0x12)&0xFF = 0x04
второй блок данных
Цитата

0x02
0x02

Сумма  (0x02+0x02)&0xFF = 0x04

А может быть в первом блоке несколько бай дающих ту же сумму. А может последний байт или слово вообще размер блока........

Добавлено через 9 минут и 41 секунду
Цитата(heavix @  16.8.2011,  11:50 Найти цитируемый пост)
Известно что она равна сумме сумм каждого четвертого байта в блоке (начиная с первого байта)...

На сколько вы в этом уверены? (Просто у меня (у клиентов) переодически возникали ситуации когда в огромном списке фин. операций нарисовывался небаланс с точностью до копейки похожий на одну из сумм... Потом выяснялось, что это всего лишь совпадение.

Цитата(heavix @  16.8.2011,  11:50 Найти цитируемый пост)
у меня задача - удалять некоторые блоки этого файла, при этом сохранив его жизнеспособность... но оказалось, что в зависимости от объема блока эта 

Так вы ж удаляете целый блок. При этом исправляются другие? Или вам надо часть блока удалить/заменить?


Цитата(heavix @  16.8.2011,  11:50 Найти цитируемый пост)
контрольная сумма для каждого блока может отличатся на 0xFD... Причем это константа для разных блоков! 

Тут бы с примерами. Т.е. если размер другой то она не FD если такой же то FD?

PM MAIL WWW   Вверх
heavix
Дата 17.8.2011, 12:25 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Шустрый
*


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

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



Цитата

Цитата

  Известно что она равна сумме сумм каждого четвертого байта в блоке (начиная с первого байта)...

 На сколько вы в этом уверены? (Просто у меня (у клиентов) переодически возникали ситуации когда в огромном списке фин. операций нарисовывался небаланс с точностью до копейки похожий на одну   из сумм... Потом выяснялось, что это всего лишь совпадение.


Уверен, на 100%... Для программы которая работает с этим форматов файлов, я создавал условия при которых в блоки записывалась известная мне информация. Я создал ситуацию когда, в выходном файле получалась 1,2,3 записи блоков, нашел все смещения к каждой записи в блоке, определил поля, и порядки для чтения байтов каждой записи... Остались предпоследние 4 байта, которые, для любых размеров блоков,и количества записей в блоке, всегда равны сумме сумм каждого 4-го байта для записи +/- n*0xfd . То есть я предполагаю, что в определенной ситуации когда суммируются 4-е байты для записи по какому-то критерию определяется нужно из этой суммы вычесть 0xFD или нет... Для некоторого количества записей и получается n*0xFD. Но должен быть какой то логический смысл во всем этом! И я его никак не могу разглядеть! Возможно это делается для того, чтобы определить было ли переполнение при подсчете суммы блока... или что-то в этом духе. Мне интерестно почему именно число 0xFD. Возможно у этого числа есть какието важные свойства.
Когда я говорил что удаляю блоки - я удаляю конкретные блоки, которые маркируются сигнатурой начала и конца блока, размеры блоков определены в заголовке... На выходе я получаю такойже файл, такого же размера, как и после удаления информации при помощи самой программы использующей даный формат файла. Отличие только в 4-х байтах контрольной суммы. Моя задача - просто написать библиотечку для возможности удаления этих записей! Готов сейчас пробовать любые, даже самые невероятные варианты - уже 3 дня сижу в hex редакторе и пытаюсь уловить закономерность, но пока безуспешно( 
PM MAIL   Вверх
voral
Дата 17.8.2011, 16:22 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Бывалый
*


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

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



что то я малость потерялся:
1 Эта контрольная сумма одна на весь файл ли существует в каждом блоке?
2 Что значит сумма сумм каждого 4-го байта. Это просто сложение каждого четвертого байта (начиная с первого)?
3 n*0xfd  - что такое n? И почему оно умножается на 0xfd?

PS трудно гадать в слепую smile
PM MAIL WWW   Вверх
heavix
Дата 19.8.2011, 13:21 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Шустрый
*


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

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



Цитата

   1 Эта контрольная сумма одна на весь файл ли существует в каждом блоке?

 - контрольная сумма представляет собой сумму контрольных сумм для каждого блока
 
Цитата

   2 Что значит сумма сумм каждого 4-го байта. Это просто сложение каждого четвертого байта (начиная с первого)?
   3 n*0xfd  - что такое n? И почему оно умножается на 0xfd?

   - контрольная сумма считается для каждого блока путем суммирования каждого 4-го байта начиная с 1-го.
   - из контрольной суммы для блока вычитается 0xFD если размер блока кратен 4  - собственно то чего я так долго не мог понять...
 Спасибо за участие))) Вопрос успешно решен)

Это сообщение отредактировал(а) heavix - 19.8.2011, 13:23
PM MAIL   Вверх
  
Ответ в темуСоздание новой темы Создание опроса
Правила форума "Алгоритмы"

maxim1000

Форум "Алгоритмы" предназначен для обсуждения вопросов, связанных только с алгоритмами и структурами данных, без привязки к конкретному языку программирования и/или программному продукту.


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

 
0 Пользователей читают эту тему (0 Гостей и 0 Скрытых Пользователей)
0 Пользователей:
« Предыдущая тема | Алгоритмы | Следующая тема »


 




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


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

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