Форум по 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.
Ответить с цитированием
  #7  
Старый 18.09.2011, 18:39
Аватар для dr. F.I.N.
dr. F.I.N. dr. F.I.N. вне форума
I Like it!
 
Регистрация: 12.12.2009
Адрес: Россия, г. Новосибирск
Сообщения: 663
Версия Delphi: D6/D7
Репутация: 26643
По умолчанию

Код:
unit Unit1;

interface

uses
  Windows, Messages, SysUtils, Variants, Classes, Graphics, Controls, Forms,
  Dialogs, StdCtrls;

type
  TForm1 = class(TForm)
    Button1: TButton;
    procedure Button1Click(Sender: TObject);
  private
    { Private declarations }
  public
    { Public declarations }
  end;

const
  l = 3;
  a: array[1..l*2] of Byte = ($7F, $D9, $91, $AB, $6E, $CB);

var
  Form1: TForm1;

implementation

{$R *.dfm}

function CheckSumm(x: array of Byte; lx: Integer): LongWord;
var
  b: array of Word;
  i: Integer;
begin
  Result := 0;
  if Odd(lx) then Exit;
  SetLength(b, lx div 2);
  Move(x[0], b[0], lx);
  for i := 1 to (lx div 2) do
  Result := Result + swap(b[i-1]);
  SetLength(b, 0);
end;

procedure TForm1.Button1Click(Sender: TObject);
begin
  ShowMessage(IntToHex(CheckSumm(a, l * 2), 8));
end;

end.
__________________
Грамотно поставленный вопрос содержит не менее 50% ответа.
Грамотно поставленная речь вызывает уважение, а у некоторых даже зависть.
Ответить с цитированием
  #8  
Старый 18.09.2011, 21:13
prorokk prorokk вне форума
Прохожий
 
Регистрация: 14.08.2011
Сообщения: 10
Репутация: 10
Радость

dr. F.I.N.
Спасибо огромное!!!!
Ответить с цитированием
  #9  
Старый 19.09.2011, 01:24
prorokk prorokk вне форума
Прохожий
 
Регистрация: 14.08.2011
Сообщения: 10
Репутация: 10
Вопрос

Вот и еще вопрос появился...
как строку file записать в массив array of word
написал так:

Код:
var
  i: Integer;
  x: array of word;

 for i := 0 to Length(x) do
  Move(file[(i * sizeof(word)) + 1], x[i],sizeof(word));

но как вычитал позже MOVE перемещает из моей строки file в приемник. а вот как скопировать? что-бы file не изменился...
Ответить с цитированием
  #10  
Старый 19.09.2011, 06:11
Аватар для dr. F.I.N.
dr. F.I.N. dr. F.I.N. вне форума
I Like it!
 
Регистрация: 12.12.2009
Адрес: Россия, г. Новосибирск
Сообщения: 663
Версия Delphi: D6/D7
Репутация: 26643
По умолчанию

Расскажи, откуда у тебя появляется строка FILE
__________________
Грамотно поставленный вопрос содержит не менее 50% ответа.
Грамотно поставленная речь вызывает уважение, а у некоторых даже зависть.
Ответить с цитированием
  #11  
Старый 19.09.2011, 09:19
prorokk prorokk вне форума
Прохожий
 
Регистрация: 14.08.2011
Сообщения: 10
Репутация: 10
Радость

итак. есть программа которая обрабатывает указанный файл
1) считывает его в строку file (20мб)
2) находит в нем нужную информацию (POS-ом)
3) считает чексумму файла
4) сохраняет pos-ы и чексумму в config.ini

я признаюсь впервые пытаюсь что-то написать на delphi. поэтому пишу так как нагуглил...
Ответить с цитированием
  #12  
Старый 19.09.2011, 09:26
Аватар для dr. F.I.N.
dr. F.I.N. dr. F.I.N. вне форума
I Like it!
 
Регистрация: 12.12.2009
Адрес: Россия, г. Новосибирск
Сообщения: 663
Версия Delphi: D6/D7
Репутация: 26643
По умолчанию

Как получается, что набор данных текстовый?? вот я чего понять не могу. а вообще, напиши мне в аську - быстрее будет. раз99два88ноль00
__________________
Грамотно поставленный вопрос содержит не менее 50% ответа.
Грамотно поставленная речь вызывает уважение, а у некоторых даже зависть.
Ответить с цитированием
  #13  
Старый 19.09.2011, 10:20
prorokk prorokk вне форума
Прохожий
 
Регистрация: 14.08.2011
Сообщения: 10
Репутация: 10
Радость

Ася тутпит... постучите: 407686810
Ответить с цитированием
Ответ


Delphi Sources

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

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

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

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


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


 

Сайт

Форум

FAQ

Соглашения

Прочее

 

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