Версия для печати темы

Нажмите сюда для просмотра этой темы в обычном формате

Форум «Всё о Паскале» _ Делфи _ Найти строку в 16-ричном представлении файла

Автор: Unconnected 28.10.2008 22:51

Нужно представить файл в шестнадцатеричном виде и найти в нём определённую текстовую строку. Вот что я смог:

var f:file of byte;
s,z,buf:string;
x:byte;
a,b,bufsize:integer;
begin
assignfile(f,'C:\***************************************************');
reset(f);
for a:=1 to filesize(f)-15 do
begin
for b:=a to a+14 do
begin
seek(f,b);
read(f,x);
s:=s+inttostr(x);
end;
bintohex(pchar(s),pchar(z),bufsize);
if z='**************' then begin
edit1.text:=z;
break;
end
else z:='';

end;

end;

По идее пограмма читает файл "порциями" по 14 символов(строка,которую надо найти,такой длины), потом переводит в шестнадцатеричный вид и, если строка соответствует нужной, останавливает цикл. Только не работает unsure.gif В делфях ещё мало понимаю,обьясните пожалуйста...


Сейчас ещё нашёл,что нужно в ASCII виде представить это...

Автор: volvo 29.10.2008 0:24

BinToHex не делает того, чего ты хочешь... Эта процедура берет число (число, а не строку), и возвращает его представление в 16-ричной СС. Тебе что найти-то надо? Файл байтов, допустим, начинается сочетанием байт со значениями от 1 до 14... Тогда приведенная к 16-ричному представлению эта последовательность будет иметь вид:
0102030405060708090A0B0C0D0E
Ты будешь искать строки, заданные именно в таком виде? Тогда вот так:

  if OpenDialog1.Execute then begin
assignfile(f, OpenDialog1.FileName);
reset(f);
for a := 0 to filesize(f) - 14 do begin
s := '';
Seek(f, a);
for b := 1 to 14 do begin
read(f, X); { <--- Читаем побайтно и сразу переводим в Hex... }
s := s + IntToHex(X, 2); { <--- ... и складываем в строку }
end;

if s = '0102030405060708090A0B0C0D0E' then begin
// нашли строку, делай что нужно
end;

end; // for a
end; // OpenDialog.Execute

Автор: Unconnected 29.10.2008 1:48

Volvo, использую код,предложенный тобой, перевёл нужную для поиска строку в HeX, убедился,что она есть в нужном файле(Hex-редактором)...не ищет почему-то... unsure.gif

Код
var f:file of byte;
    s,z,buf:string;
    x:byte;
    a,b,bufsize:integer;
begin
  assignfile(f,'C:\owner.mdb');
  reset(f);
  for a := 0 to filesize(f) - 21 do
  begin
    s := '';
    Seek(f, a);
    for b := 1 to 21 do
    begin
      read(f, X);
      s := s + IntToHex(X, 2);
    end;
    if s='55006e0063006f006e006e00650063007400650064' then begin
                                                                                                 edit1.text:=s;
                                                                                                  break;
                                                                                             end;


end;


А вот когда я в качестве S ввёл 00,то бишь точка, то нашло...

Автор: volvo 29.10.2008 17:52

Естественно... Используй большие буквы, а не маленькие. Или

if s=UpperCase('55006e0063006f006e006e00650063007400650064') then begin


У меня строка '0E0043006F006E006E006500630074001000440061' спокойно нашлась в mdb-файле...

Автор: Unconnected 29.10.2008 19:49

Спасибо,получилось! smile.gif теперь нужно часть файла конвертировать в base64. Для этого наверное тоже процедура в delphi предусмотрена?

Автор: volvo 29.10.2008 20:21

Со строками и с потоками - точно есть:

procedure EncodeStream(Input, Output: TStream);	// Кодирует поток в Base64
procedure DecodeStream(Input, Output: TStream); // Раскодирует поток из Base64 в нормальный вид
function EncodeString(const Input: string): string; // Кодирует строку в Base64
function DecodeString(const Input: string): string; // Раскодирует строку из Base64 в нормальный вид

(все функции - из модуля EncdDecd)

Автор: Unconnected 31.10.2008 0:03

Вопрос не по теме наверно... Вот какое преобразование строки надо сделать, чтобы из '530074006F0072006500640050006100730073007700' получить
'E77D34EF8D34E85D34EF6D34EB9D34EB' ?

Автор: volvo 31.10.2008 3:20

Вопрос действительно не по теме... И я вообще сомневаюсь, стоит ли на него отвечать, потому что кажется мне, что ты пытаешься что-то сделать с паролем? Подобрать хочешь?

По внешнему виду вторая строка похожа на результат хеширования MD4 или MD5 (возможно - в совокупности с другой функцией, или неоднократное применение хеширования)... Больше, извини, на эту тему я ничего говорить не буду...

Автор: Unconnected 31.10.2008 19:03

Нет,подбирать хеши у меня желания нет никакого, т.к. есть уже много программ для этих целей smile.gif Моя программа "вытаскивает" из этого файла хеш пароля, и я не вижу в этом ничего страшного. Выходная строка - действительно MD5.