![]() |
| ||
|
|
Новости |
Поиск |
FAQ |
Статьи |
Книги |
Новости VCL
| | Форумы ЧАТ |
Орешник |
|
| |||
| |||
« предыдущая ветвь | форум | следующая ветвь »
сравнение двух произвольных файлов [D7, XP]
romario © (2010-05-03 12:16:00)Программа должна сравнивать два файла и формировать текстовый файл найденных о-личий.
Файлы сравниваются побайтно. Если два соответствующих байта не совпадают, то в вы-ходной файл выводится текстовая строка, содержащая адрес, а также значения байтов из обоих файлов в 16-ричном, десятичном и в символьном виде.
При различии размеров файлов пользователь выбирает из двух возможностей:
- не сравнивать файлы;
- сравнивать до конца более короткого файла, оставшийся остаток считать отличием и вывести в выходной файл.
Начало заложил :)
но вот "Если два соответствующих байта не совпадают, то в вы-ходной файл выводится текстовая строка, содержащая адрес, а также значения байтов из обоих файлов в 16-ричном, десятичном и в символьном виде." не могу найти как сделать???
procedure TForm1.Button1Click(Sender: TObject);
var
File1, File2: string;
S1, S2: TStream;
I, R: Integer;
buttonSelected : Integer;
Val1, Val2: Byte;
begin
File1:='d:\primer1.txt';
File2:='d:\primer2.txt';
S1 := TFileStream.Create(File1, fmOpenRead or fmShareDenyNone);
S2 := TFileStream.Create(File2, fmOpenRead or fmShareDenyNone);
R:= S1.Size;
if S1.Size <> S2.Size then
begin
buttonSelected := MessageDlg('Файлы отличаются по размеру!'+#13#10+
'Сравнивать до конца короткого файла?',mtCustom,[mbYes,mbNo], 0);
if buttonSelected = mrYes then
begin
if S1.Size > S2.Size then R:=S2.Size else R:=S1.Size
end;
if buttonSelected = mrNo then Exit;
end;
for I := 0 to R - 1 do
begin
S1.Position := I;
S1.Read(PByte(@Val1)^, SizeOf(Val1));
S2.Position := I;
S2.Read(PByte(@Val2)^, SizeOf(Val2));
if Val1 <> Val2 then
begin
ShowMessage(InttoStr(Val));
Break;
end;
end;
S1.Free;
S2.Free;
end;
romario (2010-05-06 18:53:00) [1]Anatoly Podgoretsky © (05.05.10 09:00) [23]
> Это не бред!
> Отображение десятичного числа в шестнадцатеричной системе
> с минимальной шириной!
Это бред.
Во первых никакого отображения нет и в помине
и 1 это не с минимальной шириной.
Один случай на миллион, что тебе надо отображать полчисла
тут все четко и с примерами :)
http://www.delphisources.ru/pages/faq/faq_delphi_basics/IntToHex.php.html
Sha (2010-05-05 09:51:00) [2]http://transl-gunsmoker.blogspot.com/2009/08/blog-post_04.html
Anatoly Podgoretsky (2010-05-05 09:00:00) [3]
> Это не бред!
> Отображение десятичного числа в шестнадцатеричной системе
> с минимальной шириной!
Это бред.
Во первых никакого отображения нет и в помине
и 1 это не с минимальной шириной.
Один случай на миллион, что тебе надо отображать полчисла
romario (2010-05-04 11:56:00) [4]
> > romario © (03.05.10 17:02) [15]
>
> Второй параметр функции IntToHex равный 1 - это бред.
Это не бред!
Отображение десятичного числа в шестнадцатеричной системе с минимальной шириной!
Германн (2010-05-04 01:28:00) [5]
> romario © (03.05.10 17:02) [15]
Второй параметр функции IntToHex равный 1 - это бред.
Anatoly Podgoretsky (2010-05-03 21:26:00) [6]> romario (03.05.2010 17:02:15) [15]
В HEX
Anatoly Podgoretsky (2010-05-03 21:26:00) [7]> romario (03.05.2010 17:05:16) [16]
32 бита
romario (2010-05-03 19:16:00) [8]
> Правильный$Вася (03.05.10 17:43) [17]
> команда fc
есть ещё и другие команды и программы..., суть вопроса не в этом...
Правильный$Вася (2010-05-03 17:43:00) [9]команда fc
romario (2010-05-03 17:05:00) [10]Т.е. адрес должен содержать восемь бит т.е. допустим 0000ААFF...
romario (2010-05-03 17:02:00) [11]
> Anatoly Podgoretsky © (03.05.10 16:57) [14]
>
> > romario (03.05.2010 16:41:13) [13]
>
> Адрес = Position
>
Так???
...
for I := 0 to R - 1 do
begin
S1.Position := I;
S1.Read(PByte(@Val1)^, SizeOf(Val1));
S2.Position := I;
S2.Read(PByte(@Val2)^, SizeOf(Val2));
if Val1 <> Val2 then
begin
memo1.Lines.Add('File1:Адрес байта - ' + IntToStr(S1.Position) + #13#10
+'Шестнадцатеричный вид: '+'"'+IntToHex(Val1,1)+'"'
+', Десятичный вид: "'+Format('%u', [Val1])+'"'+ #13#10
+'Символьный вид: '+ '"'+chr(val1)+'"'+ #13#10
+ 'File2: Адрес байта - ' + IntToStr(S2.Position) + #13#10
+'Шестнадцатеричный вид: '+'"'+IntToHex(Val2,1)+'"'
+', Десятичный вид: "'+Format('%u', [Val2])+'"'+ #13#10
+'Символьный вид: '+ '"'+chr(val2)+'"'+ #13#10);
end;
end;
...
Но тогда другой вопрос в каком формате выводить адрес???
Anatoly Podgoretsky (2010-05-03 16:57:00) [12]> romario (03.05.2010 16:41:13) [13]
Адрес = Position
romario (2010-05-03 16:41:00) [13]
> Anatoly Podgoretsky © (03.05.10 16:33) [12]
>
> > romario (03.05.2010 16:28:11) [11]
>
> Ни PositionЮ ни Seek выводом не занимаются.
не так спросил, как определить адрес не равных байтов в файле???
Anatoly Podgoretsky (2010-05-03 16:33:00) [14]> romario (03.05.2010 16:28:11) [11]
Ни PositionЮ ни Seek выводом не занимаются.
romario (2010-05-03 16:28:00) [15]А как вывести адрес ячейки через Position или Seek?
romario (2010-05-03 16:27:00) [16]если смотреть с физической точки зрения!
romario (2010-05-03 16:26:00) [17]
> Демо © (03.05.10 16:22) [8]
>
>
> > romario © (03.05.10 12:16)
> > Программа должна сравнивать два файла и формировать текстовый
> > файл найденных о-личий.
>
>
> Такая ситуация:
> Второй файл отличается только тем, что в начало файла добавлен
> 1 лишний байт.
>
> Насколько отличаются эти два файла?
Полностью + 1 байт
Демо (2010-05-03 16:22:00) [18]
> romario © (03.05.10 12:16)
> Программа должна сравнивать два файла и формировать текстовый
> файл найденных о-личий.
Такая ситуация:
Второй файл отличается только тем, что в начало файла добавлен 1 лишний байт.
Насколько отличаются эти два файла?
RWolf (2010-05-03 14:48:00) [19]IntToStr.
romario (2010-05-03 13:18:00) [20]Есть! :)
Format('%u', [Val1])
все спасибо)