![]() |
|
|
|||||||
| Регистрация | << Правила форума >> | FAQ | Пользователи | Календарь | Поиск | Сообщения за сегодня | Все разделы прочитаны |
![]() |
|
|
Опции темы | Поиск в этой теме | Опции просмотра |
|
#1
|
|||
|
|||
|
Есть строка:
$7F $D9 $91 $AB $6E $CB ...... (размер 20мб) Ее нужно посчитать: 7FD9 + 91AB + 6ECB = 1804F ( т.е.) 32729 + 37291 + 28363 = 98383 (т.е.) (1804F) Из того что есть (очень медленно) это получаю в цикле и склеиваю в строку '$7FD9' после складываю... Пытался работать с массивом но из него не знаю как получить 2 значения только file[i] т.е. опять склеивать Просто складывать по одному байту file[i] получается раз в 20 быстрее... |
|
#2
|
|||
|
|||
|
Переходите от array of Byte к array of Word
|
|
#3
|
|||
|
|||
|
получается так:
1B 25 - 9499 2D 31 -12589 = 22088 HEX(5648) а если в калькуляторе(hex) сложить 1B25+2D31 =4856 не совсем понимаю магию чисел ![]() ![]() |
|
#4
|
|||
|
|||
|
Вроде разобрался...
|
|
#5
|
|||
|
|||
|
Код:
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
|
|||
|
|||
|
Вот функция которая тормозит но выдает нужный результат...
Код:
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
|
||||
|
||||
|
Код:
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. |
|
#8
|
|||
|
|||
|
dr. F.I.N.
Спасибо огромное!!!! ![]() |
|
#9
|
|||
|
|||
|
Вот и еще вопрос появился...
как строку 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
|
||||
|
||||
|
Расскажи, откуда у тебя появляется строка FILE
|
|
#11
|
|||
|
|||
|
итак. есть программа которая обрабатывает указанный файл
1) считывает его в строку file (20мб) 2) находит в нем нужную информацию (POS-ом) 3) считает чексумму файла 4) сохраняет pos-ы и чексумму в config.ini я признаюсь впервые пытаюсь что-то написать на delphi. поэтому пишу так как нагуглил... ![]() |
|
#12
|
||||
|
||||
|
Как получается, что набор данных текстовый?? вот я чего понять не могу. а вообще, напиши мне в аську - быстрее будет. раз99два88ноль00
|
|
#13
|
|||
|
|||
|
Ася тутпит... постучите: 407686810
|