Поиск:

Ответ в темуСоздание новой темы Создание опроса
> Алгоритм подсчета контрольного числа 
:(
    Опции темы
arlekin1980
Дата 19.7.2011, 18:50 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Новичок



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

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



Добрый день . Не могу понять алгоритм вычисления суммы. 
Есть файлик у него в конец по смещению(-2) записывается 1 байтовое число по какому-то принципу, единственное что выяснилось то что байты 0х00 и 0хFF не учитываются в подсчете. 
И если изменить какой-нибудь байт предположим прибавим к нему 1, то контрольное число уменьшиться на 1 и наоборот если убавим на 1 оно увеличится.

Вот такой примерчик попробовал:
Код

buf = open('g:\config4_74.bin','rb').read()
check=0
for i in buf[:-2:]:
    check = check + (ord(i) % 255)
print "%X" % check


результат не тот что в конце файла:
- 583A
а долхно 0х79


файлик прилагается.

Если есть идеи , помогите.

Это сообщение отредактировал(а) arlekin1980 - 19.7.2011, 18:57

Присоединённый файл ( Кол-во скачиваний: 4 )
Присоединённый файл  config4_74.zip 0,60 Kb
PM MAIL   Вверх
voral
Дата 19.7.2011, 22:39 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Бывалый
*


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

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



Цитата(arlekin1980 @  19.7.2011,  18:50 Найти цитируемый пост)
И если изменить какой-нибудь байт предположим прибавим к нему 1, то контрольное число уменьшиться на 1 и наоборот если убавим на 1 оно увеличится.

А если +/- 2?
Проверяли или нет. Нет ли заголовка не участвующего в подсчете?

Как вы определили, что 0x00 и 0xFF не участвуют? Т.е. если поменять 0xFF на 0xFE то сумма измениться или нет?

Добавлено через 3 минуты и 6 секунд
D-LINK DES-2108 ?

Добавлено через 14 минут и 29 секунд
вероятно тут нечто типа такого
Код

for(i=startByte;i<endByte;++i)
{
       if ((buf[i]!=0x00)&&(buf[i]!=0xFF))check+=~buf[i];
}
check&=0xff;

Т.е. инвертируем каждый байт (этим достигается, что при увеличении байта мы получаем уменьшение суммы) складываем.
А потом накладываем маску 0xFF.
Еще важно знать, что будет если 0x00 поменять на 0x03

Еще можно поварьировать знаковые и беззнаковые.
А если знаковые то может нужно брать по модулю.
PM MAIL WWW   Вверх
arlekin1980
Дата 20.7.2011, 08:10 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Новичок



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

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



Цитата

А если +/- 2?
Проверяли или нет. Нет ли заголовка не участвующего в подсчете?


Аналогично, если байт увеличить на 2 или ... до FE , то контрольный байт уменьшится на столько-же,  также при уменьшение.
Заголовок участвует в подсчете

Цитата

Еще важно знать, что будет если 0x00 поменять на 0x03


а вот я не знаю но если такой файл залить то ругнется контрольной суммой

и еще можно 0x00 заменить на 0xFF то контрольный байт не изменится

Цитата

код C++
for(i=startByte;i<endByte;++i)
{
       if ((buf[i]!=0x00)&&(buf[i]!=0xFF))check+=~buf[i];
}
check&=0xff;

 этот пример не работает
PM MAIL   Вверх
voral
Дата 20.7.2011, 10:47 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Бывалый
*


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

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



Цитата(arlekin1980 @  20.7.2011,  08:10 Найти цитируемый пост)
а вот я не знаю но если такой файл залить то ругнется контрольной суммой

Ну этого достаточно. Т.е. используются все байты файла кроме последних двух? Это надо знать наверняка.
Может быть следущее и это надо пробовать на нескольких вариантов такого файла:

Мне кажется:
1. Тут надо вычитать значение очередного байта или прибавлять инвертированное значение
2. Надо пробовать использовать безнаковый тип переменной
3. В случае знакового типа возможно надо брать модуль
4. Возможно необходимо задать какое-то смещение к результату. Т.е. к результату прибавить/вычесть некий байт
5. Возможно необходимо задать какое-то смещение к каждому байту. Т.е. к каждому байту прибавить/вычесть некий байт

Надо провести эксперименты со всеми комбинациями из этих пунктов.

А для начала нужно провести эксперимент. Менять значение некоего байта от 0 до 0xFF с шагом 1. И выявить все ли линейно.
PM MAIL WWW   Вверх
arlekin1980
Дата 20.7.2011, 11:10 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Новичок



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

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



Цитата(voral @ 20.7.2011,  10:47)
Ну этого достаточно. Т.е. используются все байты файла кроме последних двух? Это надо знать наверняка.
Может быть следущее и это надо пробовать на нескольких вариантов такого файла:

Мне кажется:
1. Тут надо вычитать значение очередного байта или прибавлять инвертированное значение
2. Надо пробовать использовать безнаковый тип переменной
3. В случае знакового типа возможно надо брать модуль
4. Возможно необходимо задать какое-то смещение к результату. Т.е. к результату прибавить/вычесть некий байт
5. Возможно необходимо задать какое-то смещение к каждому байту. Т.е. к каждому байту прибавить/вычесть некий байт

Надо провести эксперименты со всеми комбинациями из этих пунктов.

А для начала нужно провести эксперимент. Менять значение некоего байта от 0 до 0xFF с шагом 1. И выявить все ли линейно.

Все это я пробовал.
Но может быть в вашем понимание это выглядит немножко не так как я пробовал писать.

Может кодик-пример подкините.


Цитата

А для начала нужно провести эксперимент. Менять значение некоего байта от 0 до 0xFF с шагом 1. И выявить все ли линейно.


все линейно -  пробовали меняли. К примеру если предположим в 10 байте убавить на 1 то в контр.сумме он уменьшиться ( было кч - 0х00 станет 0x01), а за ним 15 байт увеличим на  2 (было 0xFE станет 01)
PM MAIL   Вверх
voral
Дата 20.7.2011, 11:22 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Бывалый
*


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

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



Цитата(arlekin1980 @  20.7.2011,  11:10 Найти цитируемый пост)
Может кодик-пример подкините.

Так а тут простой код (правада на си)
1. Тут надо вычитать значение очередного байта или прибавлять инвертированное значение
Код

if ((buf[i]!=0x00)&&(buf[i]!=0xFF))check+=~buf[i];
или
if ((buf[i]!=0x00)&&(buf[i]!=0xFF))check-=buf[i];

2. Надо пробовать использовать безнаковый тип переменной
Код

 char buf[...];
или
unsigned char buf[...];

3. В случае знакового типа возможно надо брать модуль
Код

if ((buf[i]!=0x00)&&(buf[i]!=0xFF))check+=~abs(buf[i]);

тут надо выяснить как функция работает с однобайтовым значением
4. Возможно необходимо задать какое-то смещение к результату. Т.е. к результату прибавить/вычесть некий байт
Код

}
check+=A;
check&=0xff;

где A от 0x00 до 0xFF
5. Возможно необходимо задать какое-то смещение к каждому байту. Т.е. к каждому байту прибавить/вычесть некий байт
Код

if ((buf[i]!=0x00)&&(buf[i]!=0xFF))check+=(~buf[i])+A;
или
if ((buf[i]!=0x00)&&(buf[i]!=0xFF))check+=~(buf[i]+A);

где A от 0x00 до 0xFF


Ну и смешивание всех этих вариантов в различных комбинациях... Если учесть, что только для чистых последних двух пунктов нужно по 256 прогонов, то понимаете сколько экспериментов нужно провести smile
PM MAIL WWW   Вверх
arlekin1980
Дата 20.7.2011, 12:56 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Новичок



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

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



Не помогло смещение ни к байту, ни к результату для сравнения вот другой конфиг

Может глядя на их возникнет другая идея
У меня они уже кончились

Это сообщение отредактировал(а) arlekin1980 - 20.7.2011, 12:57

Присоединённый файл ( Кол-во скачиваний: 2 )
Присоединённый файл  config5_100e.bin 32,04 Kb
PM MAIL   Вверх
arlekin1980
Дата 20.7.2011, 13:08 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Новичок



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

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



Вот еще

Присоединённый файл ( Кол-во скачиваний: 3 )
Присоединённый файл  config64.bin 32,04 Kb
PM MAIL   Вверх
arlekin1980
Дата 21.7.2011, 16:58 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Новичок



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

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



Все видать гуру мне не помогут в моей беде.
PM MAIL   Вверх
  
Ответ в темуСоздание новой темы Создание опроса
Правила форума "Алгоритмы"

maxim1000

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


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

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


 




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


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

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