Страница 1 из 3

Атрибуты архива

Добавлено: 17 янв 2008, 19:15
serna
Подскажите, как или где можно посмотреть
какая функция или фрагмент программы в Delphi позволяет найти контрольную сумму существующего архива (CRC32), дату и время создания архива (или вообще файла)

Re: Атрибуты архива

Добавлено: 17 янв 2008, 20:14
Duncon
Контрольная сумма вычисляется для файлов вообще, архив не архив не важно...
[syntax='delphi']
function GetCheckSum(FileName: string): DWORD;
var
F: file of DWORD;
P: Pointer;
Fsize: DWORD;
Buffer: array[0..500] of DWORD;
begin
FileMode := 0;
AssignFile(F, FileName);
Reset(F);
Seek(F, FileSize(F) div 2);
Fsize := FileSize(F) - 1 - FilePos(F);
if Fsize > 500 then
Fsize := 500;
BlockRead(F, Buffer, Fsize);
Close(F);
P := @Buffer;
asm
xor eax, eax
xor ecx, ecx
mov edi , p
@again:
add eax, [edi + 4*ecx]
inc ecx
cmp ecx, fsize
jl @again
mov @result, eax
end;
end;

procedure TForm1.Button1Click(Sender: TObject);
begin
ShowMessage(IntToStr(GetCheckSum('c:\Autoexec.bat')));
end;
[/syntax]

Re: Атрибуты архива

Добавлено: 17 янв 2008, 21:37
MOTOCoder
serna писал(а):Подскажите, как или где можно посмотреть
какая функция или фрагмент программы в Delphi позволяет найти контрольную сумму существующего архива (CRC32), дату и время создания архива (или вообще файла)
Дату и время создания можно определить так:
[syntax='delphi']
var sr:tsearchrec;
dt:tdatetime;
y,m,d,h,min,s,ms:word;
begin
findfirst('e:\temp\emgs\project1.exe',0,sr);
dt:=sysutils.FileDateToDateTime(sr.Time);
decodedate(dt,y,m,d);
decodetime(dt,h,min,s,ms);
showmessage(
'Year:'+inttostr(y)+ #10#13+
'Month:'+inttostr(m)+ #10#13+
'Day:'+inttostr(d)+ #10#13+
'Hour:'+inttostr(h)+ #10#13+
'Min:'+inttostr(min)+ #10#13+
'Sec:'+inttostr(s)+ #10#13);

end;
[/syntax]

Re: Атрибуты архива

Добавлено: 18 янв 2008, 10:43
BBB
Duncon,
Как-то простенько у тебя контрольная сумма считается :)
Конечно, под термином "контрольная сумма" можно разное понимать и считать совершенно разными алгоритмами. Но CRC-32, которое можно видеть при просмотре содержимого ZIP- и RAR-архивов счатется по-дркгому, малость посложнее.
В принципе, у меня есть unit для паскаля реализации этого алгоритма (там пользуется ассемблер, так что гарантировать компиляемость на Delphi не могу). Если кому интерсно, могу выложить.

Re: Атрибуты архива + размер упакованного файла

Добавлено: 18 янв 2008, 11:16
serna
Спасибо за фрагменты!

Мне понравился с датой и временем Короткий и удобный, по сравнению с другим, который я видеола в справке по Delphi. Единственное что краткий формат даты например 1212008 (непонятно где месяц где начало года) нужно будет ставить 12.1.2008 или преобразовывать односимвольные месяцы и даты в двухсимвольные добавалением '0'. Надеюсь это сделаю сама.

Труднее с контрольной суммой. Предложеннный фрагмент работает успешно, но мне нужна контрольная сумма в ШЕСТНАДЦАТИРИЧНОЙ системе. Каковой она отображается в окне WinRar. В предложенном примере она в десятичной системе.

И ЕЩЁ КАК ОПРЕДЕЛИТЬ РАЗМЕР ФАЙЛА после упаковки WinRar

Re: Атрибуты архива

Добавлено: 18 янв 2008, 11:27
serna
BBB,
&quot писал(а):В принципе, у меня есть unit для паскаля реализации этого алгоритма (там пользуется ассемблер, так что гарантировать компиляемость на Delphi не могу). Если кому интерсно, могу выложить.
Мне бы хотелось посмотреть. Насколько я знаю в Ассемблере используется шестнадцатиричная система счисления. Не будет работать - так хоть посмотрю текстовку - как люди умные люди решают.

Re: Атрибуты архива

Добавлено: 18 янв 2008, 11:29
Хыиуду
А перевести из 10 в 16 религия не позволяет?
Делим пошагово число на 16, берем остаток, если от 0 до 9 - так и записываем, если от 10 до 15 - возвращаем chr(ord('A')+x-10), где х - остаток

Re: Атрибуты архива

Добавлено: 18 янв 2008, 12:08
BBB
serna писал(а):Мне бы хотелось посмотреть. Насколько я знаю в Ассемблере используется шестнадцатиричная система счисления.
Думаю, Хыиуду прав, у тебя некое своеобразное непонимание о системах счисления и о том, что "там-то используется одна система, а там - другая".
В любом случае в основе всего ледат биты, которые складываются в байты. А интерпреировать байт уж можно по-всякому. Можно его рассмотривать как символ (char), можно как число. А число можно записать в разных системах счисления - это вообще уже даже из области не программирования, а математики.

Число контрольной суммы, каковым ты видишь его на экране монитора - это предмет ОТОБРАЖЕНИЯ, а не РАССЧЕТА.
В Паскале при написании программы тоже можно "использовать" 16-риченую систему.
Например следующие две строки будут абсолютно эквивалентны, так как 20 в десятичной системе равно 14 в 16-ричной:
i := 20;
i := $14;

Не будет работать - так хоть посмотрю текстовку - как люди умные люди решают.
Выклвдываю архив. Но думаю, если ты будешь пытаться вникать, то только мозги себе располавишь, почему вычисляется именно так :) У меня была статейка неслабого размера (страниц под 100), где подо все это дело подводилась теория. В итоге я где-то половину осилил и просто взял конечный алгоритм рассчета (приводившийся в статье на C).

Так что рекомендую не вникать, а просто воспользоваться функциями:
function FileZipCRC_ByHandle (var F : File; var iiCRC : ulong) : integer;
function FileZipCRC_ByName (stFileName : string; var iiCRC : ulong) : integer;



Если пытаться компилироваться под Delpi, то в файле CRCMODEL.PAS имеет смысл заменить строку №100 с:
ulong = longint;
на
ulong = Longword;
(ну не было в паскале типа числа "беззнаковое целое 4-байтное" :) )

Re: Атрибуты архива

Добавлено: 18 янв 2008, 17:12
MOTOCoder
А с какими архивами планируется работать?
Если с zip, то можно использовать компонент типа ZipForge.

Re: Атрибуты архива

Добавлено: 19 янв 2008, 21:24
serna
Хыиуду писал(а):А перевести из 10 в 16 религия не позволяет?
Делим пошагово число на 16, берем остаток, если от 0 до 9 - так и записываем, если от 10 до 15 - возвращаем chr(ord('A')+x-10), где х - остаток
Мои атеистические познания математики позволили мне вручную перевести полученную для моего файла сумму 3928029858 в 16-чную систему получилось EA20FAA2, а у меня в WinRar после архивирования у файла E67A3138 (после перевода в десятичную получается 3758094984). Значит контрольная сумма не так считается или в WinRarе учитывается ещё что-то или прав BBB - пытаюсь пробовать его алгоритм.

Контрольная сумма файла в архиве и вне его одинакова или нет?