Мастера DELPHI, Delphi programming community Рейтинг@Mail.ru Титульная страница Поиск, карта сайта Написать письмо 
| Новости |
Новости сайта
Поиск |
Поиск по лучшим сайтам о Delphi
FAQ |
Огромная база часто задаваемых вопросов и, конечно же, ответы к ним ;)
Статьи |
Подборка статей на самые разные темы. Все о DELPHI
Книги |
Новинки книжного рынка
Новости VCL
Обзор свежих компонент со всего мира, по-русски!
|
| Форумы
Здесь вы можете задать свой вопрос и наверняка получите ответ
| ЧАТ |
Место для общения :)
Орешник
Коллекция курьезных вопросов из форумов
Основная («Начинающим»)/ Базы / WinAPI / Компоненты / Сети / Media / Игры / Corba и COM / KOL / FreePascal / .Net / Прочее / rsdn.org

 
Чтобы не потерять эту дискуссию, сделайте закладку « предыдущая ветвь | форум | следующая ветвь »
Страницы: 1 2 3 4 5

Алгоритм контрольной суммы Флетчера


KSergey ©   (08.04.21 12:44[80]

> cryptologic ©   (08.04.21 12:24) [79]
> я вас в принципе не заставлял ничего делать, сами хотели отвечали, хотели не отвечали

Ожидая соответствующего отношения наличию ответов.
Но вы сами решили поступать так, как поступили.
Дело ваше.


KSergey ©   (08.04.21 13:24[81]

>  cryptologic ©   (08.04.21 12:24) [79]
> > KSergey ©   (06.04.21 08:36) [65]
> > Удивительно: рядом бурно обсуждаются какие-то сериалы
>
> Можете и дальше обсуждать, что обсуждается в соседних ветках
> я вас в принципе не заставлял ничего делать

Теперь понимаю
Верной дорогой


cryptologic ©   (10.04.21 23:08[82]

В примере который указан в википедии контрольная сумма считается в таком порядке
входные данные "abcde" ->  Uint16[ba]+[dc]+[0e] Uint32[dcba]+[000e]
В википедии в об этом указывается что нужно учитывать порядок размещения байт в памяти чисел типа Uint16, Uint32 т.е. более 1 байта и что такой проблемы с порядком не возникает в функциях fletcher8, Fletcher16 c побайтовой подачей байтов.  
Все примеры которые были здесь тоже в таком порядке.

Еще добавил две функции которые будут считать контрольную сумму в другом порядке
типа вот так "abcde"  ->  Uint16[ab]+[cd]+[e0] Uint32[abcd]+[e000]  


function Fletcher32Rev(AStrData: PAnsiChar): UInt32;
var
 sum1, sum2, len, i: UInt32;
 sum0, sum: Uint16;
 rem: Byte; // Remainder of division
 PData: PUint16;
begin
 sum1 := 0;
 sum2 := 0;
 len  := Length(PAnsiChar(AStrData));
 // Uint16 размер чтения входящего блока 2 байта
 rem  := (len mod 2);
 PData := PUint16(AStrData);

 // Определение четности
 if rem = 0 then len := len div 2
 else len := (len div 2) + 1;

 for i := 1 to len do
 begin
   sum := PData^;
   // разворачиваем байты в обратный порядок
// [ba] -> [ab]
   sum0 := ((sum0 xor sum0) or sum) shl 8;
   sum0 := sum0 or (sum shr 8);
   // Определяем, что блок последний
   // Сдвигает биты вправо, а затем обратно,
   // что бы почисть от возможного мусора в последнем блоке
   // если размер блока выходит за размер входных данных
   if (i = len) and (rem <> 0) then sum0 := (sum0 shr 8) shl 8;
   sum1 := (sum1 + sum0) mod $FFFF;
   sum2 := (sum2 + sum1) mod $FFFF;
   Inc(PData);
 end;

 Result := (sum2 shl 16) or sum1;
end;


function Fletcher64Rev(AStrData: PAnsiChar): UInt64;
var
 sum1, sum2: UInt64;
 sum, sum0, len, i: UInt32;
 rem, shift, j, b: Byte; //rem - Remainder of division
 PData : PUint32;
 
begin
 sum1  := 0;
 sum2  := 0;
 shift := 0;
 len   := Length(PAnsiChar(AStrData));
 rem   := (len mod 4); // Uint32 размер чтения входящего блока 4 байта
 PData := PUint32(AStrData);

 // Определение четности
 if rem = 0 then len := len div 4
 else
 begin
   // если rem <> 0 вычисляем сдвиг (SizeOf(sum0) - rem) * 8 Bit
   shift := (4 - rem) * 8;
   Len := (Len div 4) + 1;
 end;

 for i := 1 to len do
 begin
   sum  := PData^;
   // разворачиваем байты в обратный порядок
// Uint32[dcba] -> Uint32[abcd]
for j := 0 to 3 do
   begin
     b := (b xor b) or (sum shr (j * 8));
     sum0 := (sum0 or b);
     if i <> 3 then sum0 := sum0 shl 8;
   end;
   // Определяем, что блок последний
   // Сдвигает байты вправо, а затем обратно,
   // что бы почисть от возможного мусора в последнем блоке
   // если размер блока выходит за размер входных данных
   if (i = len) and (rem <> 0) then sum0 := (sum0 shr shift) shl shift;
   sum1 := (sum1 + sum0) mod $FFFFFFFF;
   sum2 := (sum2 + sum1) mod $FFFFFFFF;
   Inc(PData);
 end;

 Result := (sum2 shl 32) or sum1;
end;


Страницы: 1 2 3 4 5 версия для печати

Написать ответ

Ваше имя (регистрация  E-mail 







Разрешается использование тегов форматирования текста:
<b>жирный</b> <i>наклонный</i> <u>подчеркнутый</u>,
а для выделения текста программ, используйте <code> ... </code>
и не забывайте закрывать теги! </b></i></u></code> :)


Наверх

  Рейтинг@Mail.ru     Титульная страница Поиск, карта сайта Написать письмо