Модераторы: bsa
  

Поиск:

Ответ в темуСоздание новой темы Создание опроса
> контрольная сумма для ИРТ1730D/M, Помогите перевести на С с паскаля 
:(
    Опции темы
debil
  Дата 28.1.2008, 19:32 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Новичок



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

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



В описании на железо ( ИРТ1730D/M ) указано как подсчитывать контрольную сумму и приведен пример на паскале. Помогите перевести на С  smile .                
Сколько раз сталкивался с разным железом, даже у одного производителя на каждое железо разный алгоритм подсчета контрольных сумм, никакой унификации….                                            
Способ подсчета контрольной суммы для ИРТ1730
Для подсчета контрольной суммы необходимо выполнить следующие шаги:
1.    Загружаем 16-битную беззнаковую (word) переменную (KS) всеми единицами (KS=65535).
2.    Выполняем операцию "ИСКЛЮЧАЮЩЕЕ ИЛИ" над первым байтом массива, который защищается контрольной суммой, и младшим байтом переменной KS. Результат заносится в переменную KS.
3.    Сдвигаем KS на 1 бит вправо, при этом самый левый бит делаем равным нулю.
4.    Условные действия
4.1.    Если выдвинутый бит равен 1, выполняется операция "ИСКЛЮЧАЮЩЕЕ ИЛИ" над переменной KS и числом 40961(десятичное). Результат заносится в переменную KS.
4.2.    Если выдвинутый бит равен 0, выполняем переход на пункт 3.
5.    Повторить пункты 3 и 4 пока не будет выполнено 8 сдвигов.
6.    Повторить пункты 2,3,4 и 5 со следующим байтом массива, защищаемого контрольной суммой.
7.    Содержимое полученной переменной KS и есть контрольная сумма.

Пример подсчета контрольной суммы на языке паскаль

Код



Program K_S;
Var
  ST: String;

function KSUM(var S: String): String;
var
  i, l: Integer;
  KS: Word;
  SS: String;
begin
  KS := 65535;
  for i:=2 to Length(S) do
  begin
    KS := KS xor Ord(S[i]);
    for l:=1 to 8 do
     if (KS div 2)*2<>KS then KS := (KS div 2) xor 40961
     else KS := (KS div 2);
  end;
  Str(KS, SS); { Преобразование KS в текстовый вид }
  KSUM := SS;
end;




PM MAIL   Вверх
xvr
Дата 29.1.2008, 10:15 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Эксперт
****


Профиль
Группа: Комодератор
Сообщений: 7046
Регистрация: 28.8.2007
Где: Дублин, Ирландия

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



Цитата(debil @ 28.1.2008,  19:32)
В описании на железо ( ИРТ1730D/M ) указано как подсчитывать контрольную сумму и приведен пример на паскале. Помогите перевести на С  smile .                
Сколько раз сталкивался с разным железом, даже у одного производителя на каждое железо разный алгоритм подсчета контрольных сумм, никакой унификации….                                            
Способ подсчета контрольной суммы для ИРТ1730
Для подсчета контрольной суммы необходимо выполнить следующие шаги:
1.    Загружаем 16-битную беззнаковую (word) переменную (KS) всеми единицами (KS=65535).
2.    Выполняем операцию "ИСКЛЮЧАЮЩЕЕ ИЛИ" над первым байтом массива, который защищается контрольной суммой, и младшим байтом переменной KS. Результат заносится в переменную KS.
3.    Сдвигаем KS на 1 бит вправо, при этом самый левый бит делаем равным нулю.
4.    Условные действия
4.1.    Если выдвинутый бит равен 1, выполняется операция "ИСКЛЮЧАЮЩЕЕ ИЛИ" над переменной KS и числом 40961(десятичное). Результат заносится в переменную KS.
4.2.    Если выдвинутый бит равен 0, выполняем переход на пункт 3.
5.    Повторить пункты 3 и 4 пока не будет выполнено 8 сдвигов.
6.    Повторить пункты 2,3,4 и 5 со следующим байтом массива, защищаемого контрольной суммой.
7.    Содержимое полученной переменной KS и есть контрольная сумма.

Пример подсчета контрольной суммы на языке паскаль

Код



Program K_S;
Var
  ST: String;

function KSUM(var S: String): String;
var
  i, l: Integer;
  KS: Word;
  SS: String;
begin
  KS := 65535;
  for i:=2 to Length(S) do
  begin
    KS := KS xor Ord(S[i]);
    for l:=1 to 8 do
     if (KS div 2)*2<>KS then KS := (KS div 2) xor 40961
     else KS := (KS div 2);
  end;
  Str(KS, SS); { Преобразование KS в текстовый вид }
  KSUM := SS;
end;




Буйный алгоритм  smile 
Уточнение - а точно подсчет начинается со 2го символа строки? Или это опечатка/баг?
Еще вопрос - входая строка текстовая, или туда упакованны бинарные данные? (Предполагаю, что текстовая)
Код

int KSUM(char* S) // returns summ as number, not as string as in original prog!
{
 int l;
 unsigned short KS=-1;
  for(++S;*S;++S)
   {
    KS ^= *(unsigned char*)S;
    for(l=0;l<8;++l)
     if (KS&1) KS = (KS>>1) ^ 40961;
     else KS >>= 1;
   }
 return KS;
}

PM MAIL   Вверх
debil
Дата 29.1.2008, 18:11 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Новичок



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

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



Код

unsigned short GetSum( short *Data, int Size)
{
  unsigned short cs = 65535;
  for(int i = 1; i < Size; i++) // первый байт-двоеточие в подсчете не участвует 
                                             // ( описание на прибор)
    {
     cs ^= Data[i];
     for(int l = 8; l; l--)
       {
        if(cs&1) cs = (cs>>1) ^ 40961;
           else  cs = cs>>1;
       }
    }
    return cs;
}



Спасибо всем smile 
PM MAIL   Вверх
  
Ответ в темуСоздание новой темы Создание опроса
Правила форума "C/C++: Для новичков"
JackYF
bsa

Запрещается!

1. Публиковать ссылки на вскрытые компоненты

2. Обсуждать взлом компонентов и делиться вскрытыми компонентами

  • Действия модераторов можно обсудить здесь
  • С просьбами о написании курсовой, реферата и т.п. обращаться сюда
  • Вопросы по реализации алгоритмов рассматриваются здесь


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

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


 




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


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

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