| Версия для печати темы
Нажмите сюда для просмотра этой темы в оригинальном формате |
| Форум программистов > Алгоритмы > Алгоритм подсчета контрольного числа |
| Автор: arlekin1980 19.7.2011, 18:50 | ||
| Добрый день . Не могу понять алгоритм вычисления суммы. Есть файлик у него в конец по смещению(-2) записывается 1 байтовое число по какому-то принципу, единственное что выяснилось то что байты 0х00 и 0хFF не учитываются в подсчете. И если изменить какой-нибудь байт предположим прибавим к нему 1, то контрольное число уменьшиться на 1 и наоборот если убавим на 1 оно увеличится. Вот такой примерчик попробовал:
результат не тот что в конце файла: - 583A а долхно 0х79 файлик прилагается. Если есть идеи , помогите. |
| Автор: arlekin1980 20.7.2011, 08:10 | ||||||
Аналогично, если байт увеличить на 2 или ... до FE , то контрольный байт уменьшится на столько-же, также при уменьшение. Заголовок участвует в подсчете
а вот я не знаю но если такой файл залить то ругнется контрольной суммой и еще можно 0x00 заменить на 0xFF то контрольный байт не изменится
|
| Автор: voral 20.7.2011, 10:47 | ||
Ну этого достаточно. Т.е. используются все байты файла кроме последних двух? Это надо знать наверняка. Может быть следущее и это надо пробовать на нескольких вариантов такого файла: Мне кажется: 1. Тут надо вычитать значение очередного байта или прибавлять инвертированное значение 2. Надо пробовать использовать безнаковый тип переменной 3. В случае знакового типа возможно надо брать модуль 4. Возможно необходимо задать какое-то смещение к результату. Т.е. к результату прибавить/вычесть некий байт 5. Возможно необходимо задать какое-то смещение к каждому байту. Т.е. к каждому байту прибавить/вычесть некий байт Надо провести эксперименты со всеми комбинациями из этих пунктов. А для начала нужно провести эксперимент. Менять значение некоего байта от 0 до 0xFF с шагом 1. И выявить все ли линейно. |
| Автор: arlekin1980 20.7.2011, 11:10 | ||||
Все это я пробовал. Но может быть в вашем понимание это выглядит немножко не так как я пробовал писать. Может кодик-пример подкините.
все линейно - пробовали меняли. К примеру если предположим в 10 байте убавить на 1 то в контр.сумме он уменьшиться ( было кч - 0х00 станет 0x01), а за ним 15 байт увеличим на 2 (было 0xFE станет 01) |
| Автор: voral 20.7.2011, 11:22 | ||||||||||
Так а тут простой код (правада на си) 1. Тут надо вычитать значение очередного байта или прибавлять инвертированное значение
2. Надо пробовать использовать безнаковый тип переменной
3. В случае знакового типа возможно надо брать модуль
тут надо выяснить как функция работает с однобайтовым значением 4. Возможно необходимо задать какое-то смещение к результату. Т.е. к результату прибавить/вычесть некий байт
где A от 0x00 до 0xFF 5. Возможно необходимо задать какое-то смещение к каждому байту. Т.е. к каждому байту прибавить/вычесть некий байт
где A от 0x00 до 0xFF Ну и смешивание всех этих вариантов в различных комбинациях... Если учесть, что только для чистых последних двух пунктов нужно по 256 прогонов, то понимаете сколько экспериментов нужно провести |
| Автор: arlekin1980 20.7.2011, 12:56 |
| Не помогло смещение ни к байту, ни к результату для сравнения вот другой конфиг Может глядя на их возникнет другая идея У меня они уже кончились |
| Автор: arlekin1980 20.7.2011, 13:08 |
| Вот еще |
| Автор: arlekin1980 21.7.2011, 16:58 |
| Все видать гуру мне не помогут в моей беде. |