Top.Mail.Ru
Мастера DELPHI, Delphi programming community Титульная страница Поиск, карта сайта Написать письмо 
| Новости | Поиск | FAQ | Статьи | Книги | Новости VCL |
| Форумы ЧАТ | Орешник | KOL и MCK |
Форумы -» Основная («Начинающим»)/ Базы / WinAPI / Компоненты / Сети / Media / Игры / Corba и COM / KOL / FreePascal / .Net / Прочее / RSDN.ORG

« предыдущая ветвь | форум | следующая ветвь »

Представить файл в HEX-виде [D7, XP]


Страницы:   1 2 3

Cramol ©   (2011-05-28 22:59:00) 

Здравствуйте! Подскажите, пожалуйста, как сделать так, чтобы при нажатии на кнопку через OpenDialog1 выбранный файл оказался в массиве в шестнадцатеричном виде?
Это вот, знаете как, если открыть, к примеру, exe-файл в блокноте - там будут кракозябры. Вот мне надо так же, но только чтобы были не кракозябры, а именно HEX-последовательность: FF 01 A1 3F и т.д. Всё в один массив, весь файл.
Буду очень признателен за помощь!!


VirEx   (2011-05-30 06:59:00) [21]

>Cramol   (30.05.11 00:21) [19]

чтобы не "вис", нужно запускать в отдельном потоке, и прогресбар добавить шоб юзверь не скучал


Германн   (2011-05-30 03:43:00) [22]


> Cramol   (30.05.11 00:21) [19]
>
> Фух, вроде, получилось. Все работает, но проблема в том,
>  что, опять же, если загружаемый файл по размеру от 100
> Кб и больше - виснет :(
>
>

Так опять читаешь с диска по одному байту.
RWolf ©   (29.05.11 01:55) [3] тебя смутил.


Cramol   (2011-05-30 00:21:00) [23]

Фух, вроде, получилось. Все работает, но проблема в том, что, опять же, если загружаемый файл по размеру от 100 Кб и больше - виснет :(


unit Unit1;

interface

uses
 Windows, Messages, SysUtils, Variants, Classes, Graphics, Controls, Forms,
 Dialogs, StdCtrls, ExtCtrls, math, ComCtrls;

type
 TForm1 = class(TForm)
   OpenDialog1: TOpenDialog;
   Image1: TImage;
   Button4: TButton;
   redt1: TRichEdit;
   procedure Button4Click(Sender: TObject);
 private
   { Private declarations }
 public
   { Public declarations }
 end;

var
 Form1: TForm1;

implementation

{$R *.dfm}

function StreamToHex(Buf: TStream): string;
const
Convert: array[0..15] of Char = '0123456789ABCDEF';
var
i, p: integer;
B: byte;
begin
SetLength(Result, Buf.Size * 2);
p := Buf.Position;
Buf.Position := 0;
for i := 1 to Buf.Size do
begin
Buf.Read(B, 1);
Result[(i * 2) - 1] := Convert[B shr $4];
Result[(i * 2)] := Convert[B and $F];
end;
Buf.Position := p;
end;

procedure TForm1.Button4Click(Sender: TObject);
const
Convert: array[0..15] of Char = '0123456789ABCDEF';
var
i, p, r: integer;
B: byte;
str: string;

w,h, x,y: integer;
Stream: TFileStream;
color: tcolor;
begin
if OpenDialog1.Execute then
Stream := TFileStream.Create(OpenDialog1.FileName, fmOpenRead);

Stream.Seek(0,soFromBeginning);
redt1.Text:= StreamTohex(Stream);
Stream.Position :=0;
r := Stream.Size;
str:='$';

h := ceil(sqrt(r/3));
w := ceil(sqrt(r/3));

Image1.Picture.Bitmap.Height := h;
Image1.Picture.Bitmap.Width := w;

x:=0;
y:=0;
for i := 1 to Stream.Size do
begin
Stream.Read(B, 1);
str := str + Convert[B shr $4] + Convert[B and $F];
if (i mod 3) = 0 then
begin
color := stringToColor(str);
Image1.Picture.Bitmap.Canvas.Pixels[x,y] := color;
inc(x);
if x>w then
begin
  x:=0;
  inc(y);
end;
str := '$';
end;
Image1.Picture.SaveToFile('c:\test.bmp');
end;
Stream.Free;
end;

end.


clickmaker   (2011-05-29 14:15:00) [24]

> Вы говорите по байту страшно загружать. А как тогда лучше
> весь загружаемый файл преобразовать в HEX-вид?

CreateFileMapping


Inovet   (2011-05-29 13:54:00) [25]

> [16] Cramol   (29.05.11 13:49)
> А как тогда лучше весь загружаемый файл преобразовать в HEX-вид?

Лучше бы хранить в нормальном виде, а показывать кусок в каком хочешь. Ещё лучше и хранить кусок.


Cramol   (2011-05-29 13:49:00) [26]

>Это страшно загрузать по байту и особо страшно это работа с RichEdit - так память быстро кончится, там уже не до скорости будет.

Т.е. лучше будет загружать в память и там, непосредственно, уже работать с данными?
И скажите еще, пожалуйста...Вы говорите по байту страшно загружать. А как тогда лучше весь загружаемый файл преобразовать в HEX-вид?


Sha   (2011-05-29 13:43:00) [27]

> Cramol   (29.05.11 12:07) [11]
> Это можно как-то оптимизировать, чтобы скорость была побыстрее?

Для этого надо:
или уменьшить количество действий,
или ускорить каждое действие,
или и то и другое.

--
Кэп.


Anatoly Podgoretsky   (2011-05-29 13:36:00) [28]


> Cramol   (29.05.11 12:07) [11]

Это страшно загрузать по байту и особо страшно это работа с RichEdit - так память быстро кончится, там уже не до скорости будет.


Cramol   (2011-05-29 12:10:00) [29]

>А если 100 ГБ как загружать будешь?

Да не, мне больше 10 Мб не придется загружать


Inovet   (2011-05-29 12:09:00) [30]

> [11] Cramol   (29.05.11 12:07)
> Про 5-7 Мб вообще молчу.

А если 100 ГБ как загружать будешь?


Cramol   (2011-05-29 12:07:00) [31]

С горем пополам как-то все же получилось :)

procedure TForm1.btn1Click(Sender: TObject);
var
Stream: TFileStream;
buf:byte;
i:longint;
begin
if Not dlgOpen1.Execute then Exit;
Stream:=TFileStream.Create(dlgOpen1.FileName, fmOpenRead);
Stream.Seek(0,soFromBeginning);
i:=0;
while i<Stream.Size do
  begin
    Stream.Read(buf,SizeOf(buf));
    redt1.Text:= redt1.Text+IntToHex(buf, 2);
    inc(i);
  end;
end;


Файл интерпретируется в RichEdit сразу в HEX-виде. Вот только появилась другая проблема. Если файл весит, скажем, 1 Кб - всё нормально. Если 10 Кб - загружается секунд 15. Про 5-7 Мб вообще молчу.
Это можно как-то оптимизировать, чтобы скорость была побыстрее?


Плохиш   (2011-05-29 10:12:00) [32]


> Cramol   (29.05.11 02:53) [5]
> >A при помощи Ord() ты что получаешь?
> Числовой эквивалент символа

Справку почитать не пробовал, вместо своих домыслов?


Германн   (2011-05-29 05:16:00) [33]


> врать не надо

Он не врет. Он уже бредит. (Имхо сдача на носу). Поэтому сам не соображает, чего пишет. Что в коде, что на форуме.
> Но выходит несовместимость типов(
> ascii-код удается получить, если переменная s имеет тип
> ansichar, при этом просто с char он также не совместим(
>

В этой фразе сплошные смысловые "нестыковки".
Но он хоть не просит готовый код. Пока. :)


Плохиш   (2011-05-29 03:38:00) [34]


> ascii-код удается получить, если переменная s имеет тип
> ansichar, при этом просто с char он также не совместим(

врать не надо, в указанной D7 char и ansichar один и тот же тип.


clickmaker   (2011-05-29 03:13:00) [35]

> Числовой эквивалент символа

хранится в парижской палате мер и весов


Германн   (2011-05-29 03:06:00) [36]


> Числовой эквивалент символа

Вот его и пихай в IntToHex.


Cramol   (2011-05-29 02:53:00) [37]

>A при помощи Ord() ты что получаешь?
Числовой эквивалент символа


Sha   (2011-05-29 02:09:00) [38]

> IntToStr(ord(s)); - тут хочу получить ascii-код string-символа,

A при помощи Ord() ты что получаешь?


RWolf   (2011-05-29 01:55:00) [39]

не надо читать файлы через мемо, для этого есть специально предназначенные инструменты.
на выбор: file of byte, file, TFileStream.


Cramol   (2011-05-29 00:54:00) [40]

Дошел только до того, что перебираю посимвольно файл из memo, но при этом не получается сразу преобразовать символ в HEX и записать в другой memo :(

IntToStr(ord(s)); - тут хочу получить ascii-код string-символа, чтобы потом преобразовать в HEX используя IntToHex. Но выходит несовместимость типов(
ascii-код удается получить, если переменная s имеет тип ansichar, при этом просто с char он также не совместим(

Помогите, пожалуйста!


Страницы:   1 2 3

Наверх

Титульная страница Поиск, карта сайта Написать письмо