Версия для печати темы
Нажмите сюда для просмотра этой темы в оригинальном формате
Форум программистов > Delphi: Общие вопросы > Перевести файл в масив байтов


Автор: maestro2k 20.4.2006, 20:07
У меня есть такой пример. Oн создает xxx.dll из масива, но мне нужно в этот масив вставить свой файл. Я не знаю как его перевести в байты (...77,90,80,0...).

Код

var
xDLLdpr:array[0..58367] of Byte = (77,90,80,0,2,0,0,0,4,0,15,0,255,255,0,0,184,0,0,0,0,0,0,0,64,0,26,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,1,0,0,186,16,0,14,31,180,9,205,33,184,1,76,205,33,144,144,84,104,105,115,32,112,114,111,103,114,97,109,32,109,117,115,116,32,98,101,32,114,117,110,32,117,110,100,101,114,32,87,105,110,51,50,13,10,36,55,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,
0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0...
 . . .

  if OpenFile(PChar('C:\xxx.dll'),FStr,OF_EXIST)=HFILE_ERROR then
  begin
    assignfile(f,PChar('C:\xxx.dll'));
    rewrite(f);
    for i:=0 to sizeof(xDLL)-1 do
      Write(f,chr(xDLL[i]));
    closefile(f);
  end;
 

Автор: allx 20.4.2006, 20:55
maestro2k

Какойто непонятный вопрос ежели честно.  

Я так понял вопрос заклюбчается в " Как считать файл в массив байт". Если так то это можно сделать: 
1) используя TFileStream, TMemoryStream
2) используя динамический массив
3) используя статический массив заведомо большего, чем файл, размера
Все эти приемы есть в DRKB и в этом форуме обсуждалось не раз. 

Автор: Демо 20.4.2006, 20:59
Код

var
  FS: TFileStream;
begin
  FS := TFileStream.Create('C:\xxx.dll', fm_Create);
  try
    FS.Write(FS,58367);
  finally
    FS.Free;
  end;
end;

 

Автор: x77 20.4.2006, 21:33
Демо, что делает это код, FS.Write (FS, 58367)?

Код

var
  f: file;
begin
  AssignFile (f, '....');
  Rewrite (f);
  BlockWrite (f, xDLLdpr [0], 58367);
  CloseFile (f);


только напршивается вопрос smile xDLLdpr - это реальная длл-ка, "зашитая" побайтово в массив? которую требуется периодически сохранить на диск, чтобы заюзать её функции? smile 

Автор: maestro2k 20.4.2006, 22:17
Да это реальная дллка, но я так и не понял...  Мне нужно вставить в свой прэкт масив побайтово файла который будет создаватся. Как получить эго? 

Автор: Rouse_ 21.4.2006, 03:25
Маэстро, вы меня поражаете во второй раз. Зачем Вам это если Вы только учитесь?
Ок, разьясню, но сначала анекдот:
- Как обьяснить что такое бит?
- Бит - это байт деленный на восемь
- Как обьяснить что такое байт?
- Обьяснить что такое бит восемь раз.
- Обьяснение килобайта бесполезно ибо обьяснять долго, и памяти у реципиента не хватит...

Итак: данные, как это ни странно, храняться в виде битов умноженных на восемь. Обычно валяются в виде файла к которому нужно получить доступ и прочитать их. Некоторые способы открытия файла Вам уже были приведены вышеговорившими участниками.
Успешное открытие файла не даст ровным счетом ничего за исключением указателя на начало самого файла (если опустить системные вещи). После того как Вы имеете на руках указатель, можно их оттуда читать в выделенный буффер, а вот этот самый буффер и будет являться побайтовым отображением физического файла ибо образ smile
Ну и если включить телепатию по полной(с учетом что битовый образ файла умноженный на восемь у Вас не получается), то так кошерно ресурсы, кроме вас, еще никто не называл smile 

Автор: Демо 21.4.2006, 08:23
Цитата(x77 @  20.4.2006,  21:33 Найти цитируемый пост)
 что делает это код, FS.Write (FS, 58367)?


Ошибочка вышла-)

Код

FS.Write(xDLLdpr[0],58367);
 

Автор: maestro2k 21.4.2006, 20:11
Rouse_  ЭТО ФОРУМ и если здесь задают вопрос - то значит в этом есть потребность. Rouse_  ну ты дал, если ты не понял вопрос так и скажи, а что такое байт я и так без тебя знаю.
Всё тема закрыта, я уже и сам разобрался.  

Автор: RinOSpro 13.9.2007, 15:36
ДА я отвечу наверно с опозданием всетаки топик давно писался.

maestro2k  наверно прочитал вот этот пример но сам ее смысл не понял

Код

{ **** UBPFD *********** by delphibase.endimus.com ****
>> Интегрирование в EXE-шник других файлов

Процедура из указанного файла (FileName) создаёт unit в котором объявлен,
заполненный побайтово, массив и процедура сохранения этого массива обратно
в файл. Таким образом можно включить в один EXE-шник множество других
файлов (dll, ocx, dbf и т.п.) - прикрепить их как unit-ы. Фактически,
после сжатия EXE-шника программами типа UPX, получаем довольно компактный
файл, который можно использовать в качестве дистрибутива, например.

Зависимости: SysUtils, System
Автор:       Delirium
Copyright:   Delirium (Master BRAIN)
Дата:        22 мая 2002 г.
***************************************************** }

procedure FileToPas(FileName: string);
var
  BF: file of Byte;
  F: TextFile;
  P, N, S: string;
  BFSize: integer;
  BBB: Byte;
begin
  AssignFile(BF, FileName);
  Reset(BF);
  BFSize := FileSize(BF);
  P := ExtractFilePath(FileName);
  N := ExtractFileName(FileName);
  N := ChangeFileExt(N, '.PAS');
  AssignFile(F, N);
  ReWrite(F);
  Writeln(F, '(* Generated by Master BRAIN (C) 2002 *)');
  Writeln(F, 'unit ' + ChangeFileExt(N, '') + ';');
  Writeln(F);
  Writeln(F, 'interface');
  Writeln(F);
  Writeln(F, 'const FileSize:integer=' + IntToStr(BFSize) + ';');
  Writeln(F, 'FileData:array[0..' + IntToStr(BFSize - 1) + '] of Byte=');
  Writeln(F, '(');
  while not Eof(BF) do
  begin
    S := '';
    while (not Eof(BF)) and (Length(S) < 80) do
    begin
      Read(BF, BBB);
      S := S + IntToStr(BBB) + ',';
    end;
    if Eof(BF) then
      Delete(S, Length(S), 1);
    Writeln(F, S);
  end;
  CloseFile(BF);
  Writeln(F, ');');
  Writeln(F);
  Writeln(F, 'procedure SaveToFile(FileName:String);');
  Writeln(F);
  Writeln(F, 'implementation');
  Writeln(F);
  Writeln(F, 'procedure SaveToFile(FileName:String);');
  Writeln(F, 'var F:File of Byte;');
  Writeln(F, ' i:integer;');
  Writeln(F, 'begin');
  Writeln(F, 'AssignFile(F,FileName);');
  Writeln(F, 'ReWrite(F);');
  Writeln(F, 'for i:=0 to FileSize-1 do Write(F,FileData[i]);');
  Writeln(F, 'CloseFile(F);');
  Writeln(F, 'end;');
  Writeln(F);
  Writeln(F, 'end.');
  CloseFile(F);
end;


Powered by Invision Power Board (http://www.invisionboard.com)
© Invision Power Services (http://www.invisionpower.com)