Форум по Delphi программированию

Delphi Sources



Вернуться   Форум по Delphi программированию > Все о Delphi > [ "Начинающим" ]
Ник
Пароль
Регистрация <<         Правила форума         >> FAQ Пользователи Календарь Поиск Сообщения за сегодня Все разделы прочитаны

Ответ
 
Опции темы Поиск в этой теме Опции просмотра
  #1  
Старый 18.09.2011, 13:43
prorokk prorokk вне форума
Прохожий
 
Регистрация: 14.08.2011
Сообщения: 10
Репутация: 10
По умолчанию Помогите с Чексуммой

Есть строка:
$7F $D9 $91 $AB $6E $CB ...... (размер 20мб)
Ее нужно посчитать:
7FD9
+
91AB
+
6ECB
=
1804F

( т.е.)
32729
+
37291
+
28363
=
98383 (т.е.) (1804F)

Из того что есть (очень медленно) это получаю в цикле и склеиваю в строку '$7FD9' после складываю...

Пытался работать с массивом но из него не знаю как получить 2 значения
только file[i] т.е. опять склеивать

Просто складывать по одному байту file[i] получается раз в 20 быстрее...
Ответить с цитированием
  #2  
Старый 18.09.2011, 14:02
AlexSku AlexSku вне форума
Специалист
 
Регистрация: 07.05.2007
Адрес: Москва
Сообщения: 884
Репутация: 21699
По умолчанию

Переходите от array of Byte к array of Word
Ответить с цитированием
  #3  
Старый 18.09.2011, 14:33
prorokk prorokk вне форума
Прохожий
 
Регистрация: 14.08.2011
Сообщения: 10
Репутация: 10
По умолчанию

получается так:
1B 25 - 9499
2D 31 -12589 = 22088 HEX(5648)

а если в калькуляторе(hex) сложить 1B25+2D31 =4856

не совсем понимаю магию чисел
Ответить с цитированием
  #4  
Старый 18.09.2011, 15:39
prorokk prorokk вне форума
Прохожий
 
Регистрация: 14.08.2011
Сообщения: 10
Репутация: 10
Радость

Вроде разобрался...
Ответить с цитированием
  #5  
Старый 18.09.2011, 16:08
prorokk prorokk вне форума
Прохожий
 
Регистрация: 14.08.2011
Сообщения: 10
Репутация: 10
Печаль

Код:
function CheckSum(blockStrpos,blockEndPos:Integer):string;
VAR
  i: integer;
  sum: integer;
  Result2: string;
begin
  sum := 0;
  i:=0;
  for i := 0 to 884734 do  
  begin
        sum := sum +file[i]; // array of world
  end;
 Result2:=IntToHex(sum,8);
 Result:=Result2+'/'+inttostr(sum)+'/'+inttostr(Length(file)+' i '+inttostr(i);
end;

подскажите что не правильно делаю... не выдает нужного мне результата
хотя считает(вначале) вроде все верно...

Последний раз редактировалось Admin, 18.09.2011 в 18:14.
Ответить с цитированием
  #6  
Старый 18.09.2011, 16:14
prorokk prorokk вне форума
Прохожий
 
Регистрация: 14.08.2011
Сообщения: 10
Репутация: 10
По умолчанию

Вот функция которая тормозит но выдает нужный результат...
Код:
function CheckSum2(file:string; blockStrpos,blockEndPos:Integer):string;
VAR
  i,b,c:Integer;
  a:string;
 begin
    result:='';
    for i:=1 to 1769472 do
      begin
      a:= a + IntToHex(ord(file[i]),2);
          if Length(a)=4 then
           begin
            c:= c + Strtoint('$'+a);
            a:='';
           end ;
      end;
      Result:=IntToHex(c,2);
      Result:=Copy(Result,Length(Result)-3,4);
      if Length(a)>0 then
      Result:='';
  end;
Админ: Пользуемся тегами для оформления кода!

Последний раз редактировалось Admin, 18.09.2011 в 18:15.
Ответить с цитированием
Ответ


Delphi Sources

Опции темы Поиск в этой теме
Поиск в этой теме:

Расширенный поиск
Опции просмотра
Комбинированный вид Комбинированный вид

Ваши права в разделе
Вы не можете создавать темы
Вы не можете отвечать на сообщения
Вы не можете прикреплять файлы
Вы не можете редактировать сообщения

BB-коды Вкл.
Смайлы Вкл.
[IMG] код Вкл.
HTML код Выкл.
Быстрый переход


Часовой пояс GMT +3, время: 06:58.


 

Сайт

Форум

FAQ

Соглашения

Прочее

 

Copyright © Форум "Delphi Sources" by BrokenByte Software, 2004-2025