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

Модераторы: Duncon, Naeel Maqsudov, Игорь Акопян, Хыиуду

serna
Сообщения: 12
Зарегистрирован: 03 янв 2008, 21:15

17 янв 2008, 19:15

Подскажите, как или где можно посмотреть
какая функция или фрагмент программы в Delphi позволяет найти контрольную сумму существующего архива (CRC32), дату и время создания архива (или вообще файла)
Аватара пользователя
Duncon
Сообщения: 1974
Зарегистрирован: 10 окт 2004, 14:11
Откуда: Питер
Контактная информация:

17 янв 2008, 20:14

Контрольная сумма вычисляется для файлов вообще, архив не архив не важно...
[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]
MOTOCoder
Сообщения: 542
Зарегистрирован: 14 янв 2008, 20:27
Откуда: Россия, Псков

17 янв 2008, 21:37

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]
Ни что так не ограничивает фантазию программиста, как компилятор...
BBB
Сообщения: 1272
Зарегистрирован: 27 дек 2005, 13:37

18 янв 2008, 10:43

Duncon,
Как-то простенько у тебя контрольная сумма считается :)
Конечно, под термином "контрольная сумма" можно разное понимать и считать совершенно разными алгоритмами. Но CRC-32, которое можно видеть при просмотре содержимого ZIP- и RAR-архивов счатется по-дркгому, малость посложнее.
В принципе, у меня есть unit для паскаля реализации этого алгоритма (там пользуется ассемблер, так что гарантировать компиляемость на Delphi не могу). Если кому интерсно, могу выложить.
serna
Сообщения: 12
Зарегистрирован: 03 янв 2008, 21:15

18 янв 2008, 11:16

Спасибо за фрагменты!

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

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

И ЕЩЁ КАК ОПРЕДЕЛИТЬ РАЗМЕР ФАЙЛА после упаковки WinRar
serna
Сообщения: 12
Зарегистрирован: 03 янв 2008, 21:15

18 янв 2008, 11:27

BBB,
&quot писал(а):В принципе, у меня есть unit для паскаля реализации этого алгоритма (там пользуется ассемблер, так что гарантировать компиляемость на Delphi не могу). Если кому интерсно, могу выложить.
Мне бы хотелось посмотреть. Насколько я знаю в Ассемблере используется шестнадцатиричная система счисления. Не будет работать - так хоть посмотрю текстовку - как люди умные люди решают.
Хыиуду
Сообщения: 2388
Зарегистрирован: 06 мар 2005, 21:03
Откуда: Москва
Контактная информация:

18 янв 2008, 11:29

А перевести из 10 в 16 религия не позволяет?
Делим пошагово число на 16, берем остаток, если от 0 до 9 - так и записываем, если от 10 до 15 - возвращаем chr(ord('A')+x-10), где х - остаток
Искусство программирования - заставить компьютер делать все то, что вам делать лень.
Для "спасибо" есть кнопка "Спасибо" в виде звездочки внизу под ником автора поста.
BBB
Сообщения: 1272
Зарегистрирован: 27 дек 2005, 13:37

18 янв 2008, 12:08

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-байтное" :) )
У вас нет необходимых прав для просмотра вложений в этом сообщении.
MOTOCoder
Сообщения: 542
Зарегистрирован: 14 янв 2008, 20:27
Откуда: Россия, Псков

18 янв 2008, 17:12

А с какими архивами планируется работать?
Если с zip, то можно использовать компонент типа ZipForge.
Ни что так не ограничивает фантазию программиста, как компилятор...
serna
Сообщения: 12
Зарегистрирован: 03 янв 2008, 21:15

19 янв 2008, 21:24

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

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