Главная страница
    Top.Mail.Ru    Яндекс.Метрика
Форум: "Система";
Текущий архив: 2003.02.10;
Скачать: [xml.tar.bz2];

Вниз

Как ускорить чтение и обработку данных из больших файлов   Найти похожие ветки 

 
D.V.K   (2002-11-28 15:34) [0]

Здравствуйте, уважаемые. Я написал программу для расчёта CRC-32
произвольного файла. Метод расчёта - табличный (вроде, самый быстрый).
Если Файл большой (600Мб), то я считываю его в память по частям
последовательно. Размер частей - примерно 6Мб. Вычисляется всё правильно.
НО! Аналогичные функции, например, в "Windows Commander" или в "Sign of
Misery" работают примерно в 1.1-1.5 раза быстрее. Я уже оптимизировал
вычислительное ядро на ассемблере, пробовал увеличивать размер буфера
чтения, пробовал создавать два потока (один читает файл, другой
рассчитывает), пробовал работать с файлами, отображаемыми в память - не
могу догнать конкурентов (особенно "Windows Commander"). Если кто
сталкивался с подобными проблемами, помогите, пожалуйста...


 
Digitman   (2002-11-28 15:48) [1]

приведи полный код (чтение файла, расчет CRC)


 
D.V.K   (2002-12-02 09:28) [2]

Полный код процедуры:

var p:pbyte;
pt,hFile:integer;
pcrc:integer;
rs,i,j,fs,bc:integer;
ho,mi,se,ms:word;
c:integer;
bt:TTime;
crc_table:array[0..255] of integer;
const BLSIZE=10000000;
POLYNOMIAL=$EDB88320;//$4c11db7; 0=D202EF8D ff=FF000000;
begin
for i:=0 to 255 do
begin c:=i;
for j :=0 to 7 do
if (c and 1)=0 then c:=c shr 1 else c:=(c shr 1) xor POLYNOMIAL;
crc_table[i] := c;
end;
if not od1.Execute then exit;
p:=nil;
reallocmem(p,BLSIZE);
hFile:=CreateFile(pchar(od1.filename), GENERIC_READ, FILE_SHARE_READ, nil,
OPEN_EXISTING, FILE_FLAG_SEQUENTIAL_SCAN, 0);
if hFile=INVALID_HANDLE_VALUE then
begin showmessage("Can""t open file"#13#10+od1.filename);
exit;
end;
fs:=GetFileSize(hFile, @i);
c:=$FFFFFFFF; bc:=0;
bt:=time;
pcrc:=integer(@crc_table[0]);
pt:=integer(p);
repeat ReadFile(hfile,p^,BLSIZE,rs,nil);
asm
push EBX
push ESI
push edi
mov EDI,pcrc
mov EAX,c
mov ESI,pt
mov ECX,rs
or ecx,ecx
jz @mend
mov edx,255
@m1:
mov ebx,[esi]
xor ebx,eax
and EBX,edx
shr eax,8
inc ESI
shl ebx,2
xor eax,[ebx][edi]
loop @m1
mov c,eax
@mend:
pop edi
pop ESI
pop EBX
end;
inc(bc,rs);
label1.Caption:=format("%d from %d",[bc,fs]);
application.ProcessMessages;
until rs<>BLSIZE;
reallocmem(p,0);
closehandle(hFile);
bt:=time-bt;
decodetime(bt,ho,mi,se,ms);
label2.caption:=format("%d:%d",[mi,se]);
label3.Caption:=inttohex(not(c),8);
end;


 
Slym   (2002-12-02 09:39) [3]

application.ProcessMessages; - Вот это зря
Консоль работает быстрее за счет отсутствия обработки сообщений.
Не хочешь, чтоб "замерзла" форма - запихай сей код в поток.
и поставь ему (потоку) приоритет TimeCritical (тобищъ высокий).
А еще лучше, (может я и ошибаюсь) через IOComplititionRoutine


 
MegaVolt   (2002-12-02 12:22) [4]

Вот как я считаю контрольную сумму:
и основной проблемой ограничивающей скорость является скорость чтения с винта и ни что другое :( Этот модуль считает с такой же скоростью как и WinCmd. Сам модуль работает в отдельном потоке но принципиально это ни что не меняет ктоме того что интерфейс не замерзает :) unit Crc32;

interface

uses
classes, Sysutils, Dialogs;

function FileCRC32(const FileName : String) : Cardinal;
function UpdateCRC32(InitCRC : Cardinal; BufPtr : Pointer; Len : Word) : LongInt;

implementation

type
CRCTable = array [0..255] of Cardinal;

const
BufLen = 32768;

CRC32Table : CRCTable =
($00000000, $77073096, $ee0e612c, $990951ba,
$076dc419, $706af48f, $e963a535, $9e6495a3,
$0edb8832, $79dcb8a4, $e0d5e91e, $97d2d988,
$09b64c2b, $7eb17cbd, $e7b82d07, $90bf1d91,

$1db71064, $6ab020f2, $f3b97148, $84be41de,
$1adad47d, $6ddde4eb, $f4d4b551, $83d385c7,
$136c9856, $646ba8c0, $fd62f97a, $8a65c9ec,
$14015c4f, $63066cd9, $fa0f3d63, $8d080df5,

$3b6e20c8, $4c69105e, $d56041e4, $a2677172,
$3c03e4d1, $4b04d447, $d20d85fd, $a50ab56b,
$35b5a8fa, $42b2986c, $dbbbc9d6, $acbcf940,
$32d86ce3, $45df5c75, $dcd60dcf, $abd13d59,

$26d930ac, $51de003a, $c8d75180, $bfd06116,
$21b4f4b5, $56b3c423, $cfba9599, $b8bda50f,
$2802b89e, $5f058808, $c60cd9b2, $b10be924,
$2f6f7c87, $58684c11, $c1611dab, $b6662d3d,

$76dc4190, $01db7106, $98d220bc, $efd5102a,
$71b18589, $06b6b51f, $9fbfe4a5, $e8b8d433,
$7807c9a2, $0f00f934, $9609a88e, $e10e9818,
$7f6a0dbb, $086d3d2d, $91646c97, $e6635c01,

$6b6b51f4, $1c6c6162, $856530d8, $f262004e,
$6c0695ed, $1b01a57b, $8208f4c1, $f50fc457,
$65b0d9c6, $12b7e950, $8bbeb8ea, $fcb9887c,
$62dd1ddf, $15da2d49, $8cd37cf3, $fbd44c65,

$4db26158, $3ab551ce, $a3bc0074, $d4bb30e2,
$4adfa541, $3dd895d7, $a4d1c46d, $d3d6f4fb,
$4369e96a, $346ed9fc, $ad678846, $da60b8d0,
$44042d73, $33031de5, $aa0a4c5f, $dd0d7cc9,

$5005713c, $270241aa, $be0b1010, $c90c2086,
$5768b525, $206f85b3, $b966d409, $ce61e49f,
$5edef90e, $29d9c998, $b0d09822, $c7d7a8b4,
$59b33d17, $2eb40d81, $b7bd5c3b, $c0ba6cad,

$edb88320, $9abfb3b6, $03b6e20c, $74b1d29a,
$ead54739, $9dd277af, $04db2615, $73dc1683,
$e3630b12, $94643b84, $0d6d6a3e, $7a6a5aa8,
$e40ecf0b, $9309ff9d, $0a00ae27, $7d079eb1,

$f00f9344, $8708a3d2, $1e01f268, $6906c2fe,
$f762575d, $806567cb, $196c3671, $6e6b06e7,
$fed41b76, $89d32be0, $10da7a5a, $67dd4acc,
$f9b9df6f, $8ebeeff9, $17b7be43, $60b08ed5,

$d6d6a3e8, $a1d1937e, $38d8c2c4, $04fdff252,
$d1bb67f1, $a6bc5767, $3fb506dd, $048b2364b,
$d80d2bda, $af0a1b4c, $36034af6, $041047a60,
$df60efc3, $a867df55, $316e8eef, $04669be79,

$cb61b38c, $bc66831a, $256fd2a0, $5268e236,
$cc0c7795, $bb0b4703, $220216b9, $5505262f,
$c5ba3bbe, $b2bd0b28, $2bb45a92, $5cb36a04,
$c2d7ffa7, $b5d0cf31, $2cd99e8b, $5bdeae1d,

$9b64c2b0, $ec63f226, $756aa39c, $026d930a,
$9c0906a9, $eb0e363f, $72076785, $05005713,
$95bf4a82, $e2b87a14, $7bb12bae, $0cb61b38,
$92d28e9b, $e5d5be0d, $7cdcefb7, $0bdbdf21,

$86d3d2d4, $f1d4e242, $68ddb3f8, $1fda836e,
$81be16cd, $f6b9265b, $6fb077e1, $18b74777,
$88085ae6, $ff0f6a70, $66063bca, $11010b5c,
$8f659eff, $f862ae69, $616bffd3, $166ccf45,

$a00ae278, $d70dd2ee, $4e048354, $3903b3c2,
$a7672661, $d06016f7, $4969474d, $3e6e77db,
$aed16a4a, $d9d65adc, $40df0b66, $37d83bf0,
$a9bcae53, $debb9ec5, $47b2cf7f, $30b5ffe9,

$bdbdf21c, $cabac28a, $53b39330, $24b4a3a6,
$bad03605, $cdd70693, $54de5729, $23d967bf,
$b3667a2e, $c4614ab8, $5d681b02, $2a6f2b94,
$b40bbe37, $c30c8ea1, $5a05df1b, $2d02ef8d);

var
Buf : array [1..BufLen] of Byte;

function UpdateCRC32(InitCRC : Cardinal; BufPtr : Pointer; Len : Word) : LongInt;
var
crc : Cardinal;
index : Integer;
i : Cardinal;
begin
crc := InitCRC;
for i:=0 to Len-1 do begin
index := (crc xor Cardinal(Pointer(Cardinal(BufPtr)+i)^)) and $000000FF;
crc := ((crc shr 8) and $00FFFFFF) xor CRC32Table[index];
end;
Result := crc;
end;

function FileCRC32(const FileName : String) : Cardinal;
var
InFile : TFileStream;
crc32 : Cardinal;
Res : Integer;
BufPtr : Pointer;
begin
BufPtr := @Buf;
crc32 := $FFFFFFFF;
try
InFile:=TFileStream.Create(FileName,fmShareDenyNone);
Res:=InFile.Read(Buf,BufLen);
While (Res <> 0) do
begin
crc32 := UpdateCrc32(crc32,BufPtr,Res);
Res:=InFile.Read(Buf,BufLen);
end;
InFile.Destroy;
except
on Exception do ShowMessage("Ошибочка вышла "+FileName);
end;
Result := not crc32;
end;

end.


 
Digitman   (2002-12-02 12:39) [5]

>D.V.K

Да, главные "тормоза" здесь - в Application.ProcessMessages.

Кр.того, неразумно устанавливать такой большой размер блока BLSIZE (и - к тому же - некратный размеру кластера в байтах)

Организуй работу с файлом в overlapped-режиме, установи размер BLSIZE, скажем 64К (в большинстве случаев - оптимальное значение), в callback-ф-ции подсчитывай CRC для очередного считанного блока в 64К, обновляй интерфейс пользователя и запрашивай очередной блок в 64К


 
D.V.K   (2002-12-03 08:22) [6]

Я пробовал совсем без ProcessMessages - выигрыш минимальный. Хотел приоритет процесса себе поставить побольше, но посмотрел - в программах, с которыми я сравниваю, приоритет значительно не увеличивается (на глаз). Функция ReadFile с параметром OVERLAPPED в W98, по-моему, не работает (во всяком случае, запустить её не удалось). Что ещё делать - ума не приложу. Но постоянно вижу, что стремиться есть куда :).


 
MegaVoltik   (2002-12-03 09:19) [7]

Написано же руским по белому поставь размер блока 32К 64К не больше иначе у тебя не обработка идёт а пересылка между винтом и памятью а за тем кешем винта :( А если размер маленький проц все данные закачивает в кешь и там всё обрабатывает гораздо быстрее :)


 
MegaVoltik   (2002-12-03 09:23) [8]

Упс... Читать не кешем винта а кешем проца :)


 
D.V.K   (2002-12-03 09:37) [9]

Спасибо, MegaVolt.
Слегка оптимизировав Вашу программу я добился нужной скорости вычислений. Оказалось, что размер буфера лучше 16384, а вычисление CRC лучше всё-таки проводить на ASM.
В конце концов оказалось, что всё дело в уменьшении размера буфера. Уменьшив размер буфера в своей программе, я добился таких же результатов.
Кстати, оказалось, что можно заменить две строчки

shl ebx,2
xor eax,[ebx][edi]

на

xor eax,[ebx*4][edi]

Пределов нет, Джонатан...:)
PS: Кто бы мог подумать, что производительность программы обратно пропорциональна размеру буфера при малых значениях этого размера...


 
Tundra   (2002-12-03 10:27) [10]

Что такое - расчёт CRC-32?


 
MegaVoltik   (2002-12-03 11:04) [11]

Кстати а если не сложно выложи получившийся модуль (а то ассемблер то я не очень а скорость ни кому не мешала :). Кстати не совсем обратно пропорциональная зависимость будет после достижения какойто величины время обработки начнёт расти так как промежуточные операции начнут преобладать над расчётом.


 
MegaVoltik   (2002-12-03 11:14) [12]

CRC-32 это по другому контрольная сумма вычисленная с помощью чиклических кодов. 32-длинна получаемого числа бит. Эта сумма расчитывается по хитрому алгоритму (приведён выше) и обладает следующими свойствами:
1. Она уникальна для определённого набора данных (файла) и по этому её можно исспользовать для проверки правильности файла. Если будет изменён хоть один бит в файле то при подсчёте контрольной суммы она изменится.
2. Малые затраты на её расчёт. Обеспечиваются особенностями алгоритма. По этому на современных компутерах при подсчёте контрольной суммы большого файла ограничением является быстродействие винчестера а не процессора
Применяется: в архиваторах (например ZIP) а также во многих протоколах передачи данных.


 
zavdim   (2002-12-03 11:19) [13]

2MegaVoltik
1. Она уникальна для определённого набора данных (файла) и по этому её можно исспользовать для проверки правильности файла. Если будет изменён хоть один бит в файле то при подсчёте контрольной суммы она изменится.
Тоесть множество возможных файлов и их модификаций меньше 2^32?


 
MegaVolt   (2002-12-03 12:27) [14]

zavdim:
согласен но для человека который не знает что такое СRС-32 это не так уж и важно.


 
Diouzshev   (2002-12-03 14:39) [15]

4 MegaVolt © (02.12.02 12:22)
Я бы написал:

....
except
on Exception do
begin
if Assigned(InFile) then InFile.Free;
ShowMessage("Ошибочка вышла "+FileName);
end;
end;
...

может выложите код (приведенный + модификацию на асемблере) на
http://delphibase.endimus.ru/


 
// tol   (2002-12-03 15:32) [16]

Для расширения горизонтов совершенства стоило бы:
D.V.K (02.12.02 09:28)
- пожалеть потерянные при неоткрывшемся файле десять мегабайт
памяти
- использовать тот факт, что инструкция loop на нынешних
процессорах медленнее конструкции

dec ecx
jnz @_loop_start

MegaVolt © (02.12.02 12:22)
Красивый код, однако:
- конструкция

crc := ((crc shr 8) and $00FFFFFF) xor CRC32Table[index];

избыточна, поскольку после сдвига вправо на восемь бит,
старшие восемь бит будут содежать нолики и без and $00FFFFFF
- в конструкции

on Exception do ShowMessage("Ошибочка вышла "+FileName);

порожденное исключение было молча и холодно съедено и никто
никогда не узнает какая ошибочка вышла, может будет лучше так

on E: Exception do
ShowMessage(
Format(
"При обработке файла [%s] вышла " +
"вот такая oшибочка [%s]", [FileName, E.Message]));



 
MegaVolt   (2002-12-03 15:35) [17]

согласен :) но данное исключение возникало как раз когда я немог открыть файл на чтение (он был занят другой программой) и по этому освобождать его небыло необходимости :) Приведённый код можно и выложить :) а вот ассемблерный не мой :( Да и этот тоже не мой выкопал гдето в сети и немножко поправил.


 
// tol   (2002-12-03 15:43) [18]

Diouzshev (03.12.02 14:39)
может вот так будет красивее:

try
InFile:=TFileStream.Create(FileName,fmShareDenyNone);
try
...
finally
InFile.Free;
end;
except
...
end;


 
MegaVolt   (2002-12-03 16:20) [19]

тогда уж наверно нужно так:

try
try
InFile:=TFileStream.Create(FileName,fmShareDenyNone);
...
finally
InFile.Free;
end;
except
...
end;


 
// tol   (2002-12-03 16:33) [20]

MegaVolt (03.12.02 16:20)
нет, тогда управление перейдет в секцию finally даже если объект не был создан - исключение в случае невозможности открыть файл возникает при вызове TFileStream.Create


 
MegaVolt   (2002-12-03 16:41) [21]

Выложил:

http://delphibase.endimus.ru/?action=viewfunc&topic=fileattr&id=10367


 
D.V.K   (2002-12-05 10:30) [22]

Привет всем. Давненько меня здесь не было - столько много наговорили. С учётом сказанных замечаний публикую результирующий код вычисления CRC-32:

unit cop1;

interface

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

type
TForm1 = class(TForm)
Label1: TLabel;
Od1: TOpenDialog;
procedure FormActivate(Sender: TObject);
private
{ Private declarations }
public
{ Public declarations }
end;

var
Form1: TForm1;

implementation

uses cop2;

{$R *.DFM}

const crc_table:array[0..255] of integer=
(0, 1996959894, -301047508, -1727442502, 124634137, 1886057615, -379345611,
-1637575261, 249268274, 2044508324, -522852066, -1747789432, 162941995,
2125561021, -407360249, -1866523247, 498536548, 1789927666, -205950648,
-2067906082, 450548861, 1843258603, -187386543, -2083289657, 325883990,
1684777152, -43845254, -1973040660, 335633487, 1661365465, -99664541,
-1928851979, 997073096, 1281953886, -715111964, -1570279054, 1006888145,
1258607687, -770865667, -1526024853, 901097722, 1119000684, -608450090,
-1396901568, 853044451, 1172266101, -589951537, -1412350631, 651767980,
1373503546, -925412992, -1076862698, 565507253, 1454621731, -809855591,
-1195530993, 671266974, 1594198024, -972236366, -1324619484, 795835527,
1483230225, -1050600021, -1234817731, 1994146192, 31158534, -1731059524,
-271249366, 1907459465, 112637215, -1614814043, -390540237, 2013776290,
251722036, -1777751922, -519137256, 2137656763, 141376813, -1855689577,
-429695999, 1802195444, 476864866, -2056965928, -228458418, 1812370925,
453092731, -2113342271, -183516073, 1706088902, 314042704, -1950435094,
-54949764, 1658658271, 366619977, -1932296973, -69972891, 1303535960,
984961486, -1547960204, -725929758, 1256170817, 1037604311, -1529756563,
-740887301, 1131014506, 879679996, -1385723834, -631195440, 1141124467,
855842277, -1442165665, -586318647, 1342533948, 654459306, -1106571248,
-921952122, 1466479909, 544179635, -1184443383, -832445281, 1591671054,
702138776, -1328506846, -942167884, 1504918807, 783551873, -1212326853,
-1061524307, -306674912, -1698712650, 62317068, 1957810842, -355121351,
-1647151185, 81470997, 1943803523, -480048366, -1805370492, 225274430,
2053790376, -468791541, -1828061283, 167816743, 2097651377, -267414716,
-2029476910, 503444072, 1762050814, -144550051, -2140837941, 426522225,
1852507879, -19653770, -1982649376, 282753626, 1742555852, -105259153,
-1900089351, 397917763, 1622183637, -690576408, -1580100738, 953729732,
1340076626, -776247311, -1497606297, 1068828381, 1219638859, -670225446,
-1358292148, 906185462, 1090812512, -547295293, -1469587627, 829329135,
1181335161, -882789492, -1134132454, 628085408, 1382605366, -871598187,
-1156888829, 570562233, 1426400815, -977650754, -1296233688, 733239954,
1555261956, -1026031705, -1244606671, 752459403, 1541320221, -1687895376,
-328994266, 1969922972, 40735498, -1677130071, -351390145, 1913087877,
83908371, -1782625662, -491226604, 2075208622, 213261112, -1831694693,
-438977011, 2094854071, 198958881, -2032938284, -237706686, 1759359992,
534414190, -2118248755, -155638181, 1873836001, 414664567, -2012718362,
-15766928, 1711684554, 285281116, -1889165569, -127750551, 1634467795,
376229701, -1609899400, -686959890, 1308918612, 956543938, -1486412191,
-799009033, 1231636301, 1047427035, -1362007478, -640263460, 1088359270,
936918000, -1447252397, -558129467, 1202900863, 817233897, -1111625188,
-893730166, 1404277552, 615818150, -1160759803, -841546093, 1423857449,
601450431, -1285129682, -1000256840, 1567103746, 711928724, -1274298825,
-1022587231, 1510334235, 755167117);

var pt,pcrc:integer;

procedure TForm1.FormActivate(Sender: TObject);
var p:pbyte;
const BLSIZE=16384;

function CountFileCRC32(fn:string):integer;
var hFile:THandle;
CRC,rs:integer;
begin
hFile:=CreateFile(pchar(fn), GENERIC_READ, FILE_SHARE_READ, nil,
OPEN_EXISTING, FILE_FLAG_SEQUENTIAL_SCAN, 0);
if hFile=INVALID_HANDLE_VALUE then
begin showmessage("Can""t open file"#13#10+fn);
exit;
end;
CRC:=$FFFFFFFF;
repeat
ReadFile(hfile,p^,BLSIZE,rs,nil);
asm
push EBX
push ESI
push edi
mov EDI,pcrc
mov ESI,pt
mov EAX,CRC
mov ECX,rs
or ecx,ecx
jz @mend
mov edx,255
@m1: mov ebx,[esi]
xor ebx,eax
and EBX,edx
shr eax,8
inc ESI
xor eax,[ebx*4][edi]
dec ecx
jnz @m1
mov CRC,eax
@mend: pop edi
pop ESI
pop EBX
end;
until rs<>BLSIZE;
closehandle(hFile);
Result:= not crc;
end;

begin
if not od1.execute then exit;
p:=nil;
reallocmem(p,BLSIZE);
pcrc:=integer(@crc_table[0]);
pt:=integer(p);
label1.Caption:=inttohex(CountFileCRC32(od1.filename),8);
reallocmem(p,0);
end;

end.




 
Digitman   (2002-12-05 15:08) [23]

все хорошо, за исключением того, что нет необходимости хранить crc_table в исп.файле

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


const
CRC32Poly = $EDB88320; //константа полинома по-умолчанию

type

TCRC32 = Longword;
PCRC32 = ^TCRC32;

TCRC32Table = array[0..255] of TCRC32;
PCRC32Table = ^TCRC32Table;
.....

implementation
....
var
CRC32Table: PCRC32Table = nil;
...

// расчет таблицы для заданного значения полинома InitCRC
procedure MakeCRC32Table(CRC32Table: PCRC32Table; const InitCRC: TCRC32 = CRC32Poly);
var
i,j: Integer;
r: TCRC32;
begin
for i:= Low(TCRC32Table) to High(TCRC32Table) do begin
r:= i;
for j:= 8 downto 1 do
if (r and 1) = 1 then
r:= (r shr 1) xor InitCRC
else
r:= r shr 1;
CRC32Table[i]:= r;
end;
end;
...

initialization
...
New(CRC32Table); //выделяем память под таблицу
MakeCRC32Table(CRC32Table, CRC32Poly); //расчитываем и заполняем таблицу
...

finalization
...
if Assigned(CRC32Table) then
Dispose(CRC32Table); // освобождаем память под таблицу



 
Jeer   (2002-12-05 16:54) [24]

Для любителей C или DLL

#include <stdio.h>

int main();
unsigned long getcrc();
void crcgen();

unsigned long crcTable[256];

int main( argc, argv )
int argc;
char *argv[];
{
int i;
FILE *fp;
unsigned long crc;

crcgen();
if (argc < 2) {
crc = getcrc( stdin );
printf("crc32 = %08lx for <stdin>\n", crc);
} else {
for (i=1; i<argc; i++) {
if ( (fp=fopen(argv[i],"rb")) == NULL ) {
printf("error opening file \"%s\"!\n",argv[i]);
} else {
crc = getcrc( fp );
printf("crc32 = %08lx for \"%s\"\n",
crc, argv[i]);
fclose( fp );
}
}
}
return( 0 );
}

unsigned long getcrc( fp )
FILE *fp;
{
register unsigned long crc;
int c;

crc = 0xFFFFFFFF;
while( (c=getc(fp)) != EOF ) {
crc = ((crc>>8) & 0x00FFFFFF) ^ crcTable[ (crc^c) & 0xFF ];
}
return( crc^0xFFFFFFFF );
}

void crcgen( )
{
unsigned long crc, poly;
int i, j;

poly = 0xEDB88320L;
for (i=0; i<256; i++) {
crc = i;
for (j=8; j>0; j--) {
if (crc&1) {
crc = (crc >> 1) ^ poly;
} else {
crc >>= 1;
}
}
crcTable[i] = crc;
}
}

CRC-32b version 1.03 by Craig Bruce, 27-Jan-94



 
Digitman   (2002-12-05 17:18) [25]

>Jeer

Те же я., только - вид сбоку)

Собссно, оттуда и содрано и адаптировано



Страницы: 1 вся ветка

Форум: "Система";
Текущий архив: 2003.02.10;
Скачать: [xml.tar.bz2];

Наверх





Память: 0.54 MB
Время: 0.029 c
8-28932
Tornado
2002-10-24 08:03
2003.02.10
Подскажите


7-29113
arc
2002-12-04 15:38
2003.02.10
Из памяти на диск


3-28658
VFP
2003-01-24 07:29
2003.02.10
Логическая переменная на SQL


1-28909
Unvisible
2003-01-31 08:42
2003.02.10
Определение RGB кода в Delphi


1-28730
Vitus
2003-01-31 18:44
2003.02.10
Почему не работает ShortDateFormat?





Afrikaans Albanian Arabic Armenian Azerbaijani Basque Belarusian Bulgarian Catalan Chinese (Simplified) Chinese (Traditional) Croatian Czech Danish Dutch English Estonian Filipino Finnish French
Galician Georgian German Greek Haitian Creole Hebrew Hindi Hungarian Icelandic Indonesian Irish Italian Japanese Korean Latvian Lithuanian Macedonian Malay Maltese Norwegian
Persian Polish Portuguese Romanian Russian Serbian Slovak Slovenian Spanish Swahili Swedish Thai Turkish Ukrainian Urdu Vietnamese Welsh Yiddish Bengali Bosnian
Cebuano Esperanto Gujarati Hausa Hmong Igbo Javanese Kannada Khmer Lao Latin Maori Marathi Mongolian Nepali Punjabi Somali Tamil Telugu Yoruba
Zulu
Английский Французский Немецкий Итальянский Португальский Русский Испанский