Версия для печати темы
Нажмите сюда для просмотра этой темы в оригинальном формате
Форум программистов > Алгоритмы > Алгоритм подсчета контрольного числа


Автор: arlekin1980 19.7.2011, 18:50
Добрый день . Не могу понять алгоритм вычисления суммы. 
Есть файлик у него в конец по смещению(-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


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

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

Автор: voral 19.7.2011, 22:39
Цитата(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

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

Автор: arlekin1980 20.7.2011, 08:10
Цитата

А если +/- 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;

 этот пример не работает

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

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

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

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

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

Автор: arlekin1980 20.7.2011, 11:10
Цитата(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)

Автор: voral 20.7.2011, 11:22
Цитата(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

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

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

Автор: arlekin1980 20.7.2011, 13:08
Вот еще

Автор: arlekin1980 21.7.2011, 16:58
Все видать гуру мне не помогут в моей беде.

Powered by Invision Power Board (http://www.invisionboard.com)
© Invision Power Services (http://www.invisionpower.com)