Версия для печати темы
Нажмите сюда для просмотра этой темы в оригинальном формате
Форум программистов > Delphi: Для новичков > Загрузка файла в hex


Автор: APXEOLOG 23.9.2007, 16:07
Как откыть ллюбой файл в hex коде - желательно описать от начала и до конца.
Также его надо будет еще сохранить(опять же в hex)

Автор: Alkash 23.9.2007, 16:12
Код

begin
  {Если файл очень большой, то его бессмысленно сразу весь загружать в прогу,
  т.к. может даже не хватить памяти для этого. Будем загружать его по кусочкам}
  Caption := 'Редактор двоичных файлов - ' + OpenDialog1.FileName;
  MaxLineCount := (Memo.Height div Memo.Font.Size) * 60 div 100 - 1;
  fSize := FileSize(OpenDialog1.FileName); // Определяем размер файла

  ScrollBar1.Enabled := True;
  ScrollBar1.PageSize := 1;
  ScrollBar1.LargeChange := 1;
  ScrollBar1.Max := 100;
   // Вычисляем характеристики ScrollBar
  if (fSize div 16 - (MaxLineCount - 2)) > 1 then begin
    ScrollBar1.Max := fSize div 16 - (MaxLineCount - 2);
    ScrollBar1.PageSize := MaxLineCount div ScrollBar1.Max;
    ScrollBar1.LargeChange := MaxLineCount - 1;
  end else begin
    ScrollBar1.Max := 1;
    ScrollBar1.PageSize := 1;
    ScrollBar1.LargeChange := 1;
    ScrollBar1.Enabled := False;
  end;
  ScrollBar1.Position := 0;
  ScrollBar1Change(Sender);
end;


Код

var
  Fs: TFileStream;
  StartByte: Integer;
  BytesCount, MaxBytesCount: Integer;
  Ar: array[1..1000] of Byte;
  S, STxt: string;
  I: Integer;
  C: Byte;
  Pos: Integer;
  LastAdr: Integer;
begin
  // По позиции ползунка определяем, с какой строки надо начать
  // считывание инфы из файла

  if ScrollBar1.Max = 1 then StartByte := 0 else
    StartByte := ScrollBar1.Position * 16 - 16;
  MaxBytesCount := MaxLineCount * 16;
  if fSize - StartByte >= MaxBytesCount then BytesCount := MaxBytesCount else
    BytesCount := fSize - StartByte;

  MemSelStart := Memo.SelStart;
  Memo.Clear;
  Fs := TFileStream.Create(OpenDialog1.FileName, fmOpenRead);
  Fs.Seek(StartByte, soFromBeginning);
  Pos := Fs.Position;
  Fs.Read(Ar, BytesCount);
  Fs.Free;

  C := 0;
  LastAdr := 0;

  // Цикл заполнения окна Memo
  for I := 1 to BytesCount do begin
    Inc(C);
    S := S + IntToHex(Ar[I], 2) + ' ';
    if (Ar[I] = 0) or (Ar[I] = $09) or (Ar[I] = $0D) or (Chr(Ar[I]) = '')
      then STxt := STxt + Chr($10) else
      STxt := STxt + Chr(Ar[I]);

    if C = 8 then S[Length(S)] := '|';

    if (C = 16) then begin
      Inc(Pos, C);
      Memo.Lines.Append(IntToHex(Pos - 16, 8) + ': ' + S + '| ' + STxt);
      S := '';
      STxt := '';
      C := 0;
      LastAdr := Pos;
    end;

    if (I = BytesCount) and (C > 0) then begin
      while Length(S) < 48 do S := S + ' ';
      Memo.Lines.Append(IntToHex(LastAdr, 8) + ': ' + S + '| ' + STxt);
      Break;
    end; // if
  end; // for
  if MemSelStart > Length(Memo.Text) - 80 then
    MemSelStart := Length(Memo.Text) - 80;
  Memo.SelStart := MemSelStart;
end;



Код

var
  FS: TFileStream;
  B: Byte;
begin
  if LabeledEditHEX.Text = '' then Exit;
  B := Strtoint('$' + LabeledEditHEX.Text);
  FS := TFileStream.Create(OpenDialog1.FileName, fmOpenWrite);
  FS.Seek(StatusBar1.Tag, soFromBeginning);
  FS.Write(B, 1);
  FS.Free;
  ScrollBar1Change(Sender);
end;

Автор: APXEOLOG 24.9.2007, 05:26
Я еще новичек и мб не понимаю ничего так что прось ба все разжевывать.
1.Не все переменные описаны(не нашел MaxBytesCount)
2.Надо что файл для открытия(имя будет забито) открывался из папки где лежит это прога.

И еще файл небольшой 200кб гдето так что можно полностью грузить.

Автор: APXEOLOG 25.9.2007, 06:40
Никто не поможет что-ли  smile 

Автор: Snowy 25.9.2007, 10:37
Цитата(APXEOLOG @  23.9.2007,  16:07 Найти цитируемый пост)
Как откыть ллюбой файл в hex коде
Что ты имеешь в виду?
Как это "открыть в hex коде"?
Можно его показать в шестнадцатеричном виде, если ты это имел ввиду.
Уточни вопрос. Что ты хочешь сделать? Какого результата ожидаешь? и для чего?

Автор: APXEOLOG 25.9.2007, 15:35
Мне нужна программа для редактирования 2 файлов itemname.bin и itemname.ptk. Открывается форма, там указывается путь к этим файлам.Затем открывается другая форма на которой 2 эти файла представлены в виде кода.
При нажатии кнопочки сохранить все изменения в обоих кодах сохраняются в свои файлы.

Автор: Snowy 25.9.2007, 16:20
Ну скачай какой-нить компонент hex редактора.
http://www.torry.net/pages.php?id=1176

Автор: DvarfInkvizitor 30.10.2007, 13:29
Хочу поднять этот вопрос еще раз. В моей программе необходимо открывать файл именно в hex-коде и править некоторые значения, при этом выводить содержимое файла на экран не нужно. Отдельные редакторы меня не устроят, т.к. программа расчитана на автоматизацию процесса, и значения внутри файла могут измениться не один раз за время работы программы!

Автор: Alexeis 30.10.2007, 13:52
Цитата(DvarfInkvizitor @  30.10.2007,  13:29 Найти цитируемый пост)
В моей программе необходимо открывать файл именно в hex-коде и править некоторые значения, при этом выводить содержимое файла на экран не нужно.

  Зачем тогда конвертить его в HEX? HEX же для людей придумали, машине проще с BIN работать...

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