Модераторы: Poseidon, Snowy, bems, MetalFan
  

Поиск:

Ответ в темуСоздание новой темы Создание опроса
> Как преобразовать файл в строку(Файл бинарный)? 
:(
    Опции темы
h1tter
Дата 2.7.2006, 18:33 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Новичок



Профиль
Группа: Участник
Сообщений: 7
Регистрация: 25.6.2006

Репутация: нет
Всего: нет



Помогите справиться с почти ламерской задачкой smile
Как преобразовать файл в строку(Файл бинарный),
пробовал отображать файл в память но запутался с
указателями.Вот:
Код

function MapFile(var FileName: string): string;
var
  MapFile: THandle;
  MappedFile: THandle;
  MapViewFile: THandle;
  PBuffer: ^String;
  Buffer: String;
  Size: Integer;
begin
  //1
try
  MapFile:=FileOpen(FileName,fmOpenRead);
  if MapFile=INVALID_HANDLE_VALUE then exit;
  //2
  Size:=GetFileType(MapFile);
  MappedFile:=CreateFileMapping(MapFile,nil,PAGE_READONLY,0,Size,'OMON-File Scan!');
  if MappedFile=0 then exit;
  //3
  GetMem(PBuffer,Size+1);
  PBuffer:=MapViewOfFile(MappedFile,FILE_MAP_READ,0,0,Size);
  Buffer:=PBuffer^;
  Result:=Buffer;
  FreeMem(PBuffer); 
finally
  UnmapViewOfFile(PBuffer);
  FileClose(MapFile);
end;
end;

Если можно помогите заставить работать этот код, а лучше предложите свой! smile
Весь процесс должен быть быстрым(Как можно быстрее!), 
PM MAIL   Вверх
Poseidon
Дата 2.7.2006, 18:52 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Delphi developer
****


Профиль
Группа: Комодератор
Сообщений: 5273
Регистрация: 4.2.2005
Где: Гомель, Беларусь

Репутация: 53
Всего: 133



Ничего не понял. Ты хочешь bin перевести в string? Зачем? Не могу понять причин постановки этой задачи 


--------------------
Если хочешь, что бы что-то работало - используй написанное, 
если хочешь что-то понять - пиши сам...
PM MAIL ICQ   Вверх
Yanis
Дата 2.7.2006, 19:32 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Эксперт
****


Профиль
Группа: Участник Клуба
Сообщений: 2937
Регистрация: 9.2.2004
Где: Москва

Репутация: 72
Всего: 111



h1tter
А что тебе с этим бинарным файлом делать то надо? Загнать всё в строку не получится потому, что в файле может встретиться байт $00 и тогда строка обрежется на этой позиции. НО для текстовых мона и так:
Код

function MapFile(FileName: string): string;
var
  hFile, hMapped, dwSize: DWORD;
  pFView: PChar;
begin
  hFile := FileOpen(FileName, fmOpenRead);
  dwSize := GetFileSize(hFile, nil);
  hMapped := CreateFileMapping(hFile, nil, PAGE_READONLY, 0, dwSize, PChar('mapping_test'));
  if hMapped <> 0 then
    begin
      pFView := MapViewOfFile(hMapped, FILE_MAP_READ, 0, 0, dwSize);
      if pFView <> nil then
        Result := pFView;
    end;

  UnmapViewOfFile(pFView);
  CloseHandle(hMapped);
  CloseHandle(hFile);
end;
 


--------------------
user posted image *щёлк*
PM MAIL WWW ICQ   Вверх
Matematik
Дата 2.7.2006, 22:41 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Эксперт
***


Профиль
Группа: Завсегдатай
Сообщений: 1027
Регистрация: 11.3.2006

Репутация: 17
Всего: 50



Мне казалось в string можно загнать все что угодно
Делаю я примерно так
Код

function GetStr(const FileName:AnsiString):AnsiString;
var f : TFileStream;
begin
  f := TFileStream.Create(FileName, fmOpenRead);
  SetLength(result, f.Size);
  f.Read(result[1], f.Size);
  f.Free;
end;

  

Это сообщение отредактировал(а) Matematik - 2.7.2006, 22:42
PM MAIL WWW ICQ   Вверх
Mechanic
Дата 2.7.2006, 22:43 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Бывалый
*


Профиль
Группа: Участник
Сообщений: 228
Регистрация: 5.5.2006
Где: Kharkov, Ukraine

Репутация: 6
Всего: 7



Весь прикол в PChar, ить он не понимает #0 внутри строки. Насколько я понял по вот этому ('OMON-File Scan!' smile), нужно просто апплить текстовые функи для этого контента?
Ну раз файл маппится в память, то нужно просто тип указателя нужный создать. Что за строковые функи юзятся? Может быть, вовсе не обязательно данные как строку воспринимать? Если типа RScan, то это всё равно PChar, и опять тот же #0 в качестве гемора..  smile  А если это AnsiXXX функи, то можно же "наи.." (обмануть) компилер, подставив в реальную анси-строковую переменную адрес и размер нужной области памяти?

Добавлено @ 22:50 
Цитата(Matematik @  2.7.2006,  22:41 Найти цитируемый пост)
SetLength(result, f.Size);

Медленнее, чем с мапом, но вполне жизнеспособно, даже с #0 - контентом.  smile 
Чего не скажешь о TStringStream.DataString.. smile 
--------------------
Tell me the extensions of the files You backup and I'll tell You who You are..  ©Mch  
PM   Вверх
h1tter
Дата 3.7.2006, 11:09 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Новичок



Профиль
Группа: Участник
Сообщений: 7
Регистрация: 25.6.2006

Репутация: нет
Всего: нет



Цитата(Yanis @  2.7.2006,  19:32 Найти цитируемый пост)
А что тебе с этим бинарным файлом делать то надо? Загнать всё в строку не получится потому, что в файле может встретиться байт $00 и тогда строка обрежется на этой позиции.

Так вот самая х*ень заключается в энтом #0, он мне все портит, а в файле как-раз этих #0.
Просто есть файл (Любой:Бинарный, рисунок,и.т.д..) а на выходе должна быть строкаsmile 
 
PM MAIL   Вверх
Alexeis
Дата 3.7.2006, 11:36 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Амеба
Group Icon


Профиль
Группа: Админ
Сообщений: 11743
Регистрация: 12.10.2005
Где: Зеленоград

Репутация: 109
Всего: 459



h1tter, я так понял эта задача к программе антивируса.
Чтобы переделать bin в делфийскую строку, придется сделать новый файл размером старый + 9 байт, первые 4 байта счетчик ссылок, можно установить в 1, вторые 4 байта - чистый размер строки, последний байт будет #0. После этого можно его мапить.
Например если адрес первого байта отобразить в указатель p, то получим
Код

var 
  s : AnsiString;
Begin
  s := AnsiString(Cardinal(p)+8);
...................

Но это все имеет смысл только если файлы больше чем могут поместится в ОЗУ, иначе не нужно ни каких отображений. 


--------------------
Vit вечная память.

Обсуждение действий администрации форума производятся только в этом форуме

гениальность идеи состоит в том, что ее невозможно придумать
PM ICQ Skype   Вверх
h1tter
Дата 3.7.2006, 13:16 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Новичок



Профиль
Группа: Участник
Сообщений: 7
Регистрация: 25.6.2006

Репутация: нет
Всего: нет



Цитата(alexeis1 @  3.7.2006,  11:36 Найти цитируемый пост)
h1tter, я так понял эта задача к программе антивируса.

Ok!

[/code]
Цитата(alexeis1 @  3.7.2006,  11:36 Найти цитируемый пост)
Чтобы переделать bin в делфийскую строку, придется сделать новый файл размером старый + 9 байт, первые 4 байта счетчик ссылок, можно установить в 1, вторые 4 байта - чистый размер строки, последний байт будет #0. После этого можно его мапить.

Можно пример показать?

А если использовать TMemoryStream и его свойство Memory, но тогда как? 
PM MAIL   Вверх
Alexeis
Дата 4.7.2006, 14:27 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Амеба
Group Icon


Профиль
Группа: Админ
Сообщений: 11743
Регистрация: 12.10.2005
Где: Зеленоград

Репутация: 109
Всего: 459



Цитата(h1tter @  3.7.2006,  12:16 Найти цитируемый пост)
А если использовать TMemoryStream и его свойство Memory, но тогда как? 

Уточните задачу - файл, помещается в память или нет. Если помещается, то смысла в мапинге нет. Судя по прозьбе примера с TMemoryStrea, все таки пытаетесь загрузить файл в память целиком.

Добавлено @ 14:38 
Код

procedure TForm1.btn1Click(Sender: TObject);
var
  fs : TFileStream;
  ms : TMemoryStream;
  C : Cardinal;
  b : Byte;
  s : AnsiString;

begin
  fs := TFileStream.Create('1.txt', fmOpenRead or fmShareDenyRead);
  fs.Position := 0;
  ms := TMemoryStream.Create;
  ms.Position := 0;
  ms.Size := fs.Size + 9;
  C := 1;
  ms.WriteBuffer(C, SizeOf(C));
  C := fs.Size;
  ms.WriteBuffer(C, SizeOf(C));
  ms.CopyFrom(fs, fs.Size);
  b := 0;
  ms.WriteBuffer(b, SizeOf(b));
  ms.Position := 0;
  s := AnsiString(Cardinal(ms.Memory)+8);
  Memo1.Text := s;
end;
  

Это сообщение отредактировал(а) alexeis1 - 4.7.2006, 14:39

Присоединённый файл ( Кол-во скачиваний: 16 )
Присоединённый файл  1.zip 0,23 Kb


--------------------
Vit вечная память.

Обсуждение действий администрации форума производятся только в этом форуме

гениальность идеи состоит в том, что ее невозможно придумать
PM ICQ Skype   Вверх
  
Ответ в темуСоздание новой темы Создание опроса
Правила форума "Delphi: Общие вопросы"
SnowyMetalFan
bemsPoseidon
Rrader

Запрещается!

1. Публиковать ссылки на вскрытые компоненты

2. Обсуждать взлом компонентов и делиться вскрытыми компонентами

  • Литературу по Дельфи обсуждаем здесь
  • Действия модераторов можно обсудить здесь
  • С просьбами о написании курсовой, реферата и т.п. обращаться сюда
  • Вопросы по реализации алгоритмов рассматриваются здесь
  • 90% ответов на свои вопросы можно найти в DRKB (Delphi Russian Knowledge Base) - крупнейшем в рунете сборнике материалов по Дельфи


Если Вам понравилась атмосфера форума, заходите к нам чаще! С уважением, Snowy, MetalFan, bems, Poseidon, Rrader.

 
0 Пользователей читают эту тему (0 Гостей и 0 Скрытых Пользователей)
0 Пользователей:
« Предыдущая тема | Delphi: Общие вопросы | Следующая тема »


 




[ Время генерации скрипта: 0.0558 ]   [ Использовано запросов: 22 ]   [ GZIP включён ]


Реклама на сайте     Информационное спонсорство

 
По вопросам размещения рекламы пишите на vladimir(sobaka)vingrad.ru
Отказ от ответственности     Powered by Invision Power Board(R) 1.3 © 2003  IPS, Inc.