![]() |
| ||
|
|
Новости |
Поиск |
FAQ |
Статьи |
Книги |
Новости VCL
| | Форумы ЧАТ |
Орешник |
|
| |||
| |||
« предыдущая ветвь | форум | следующая ветвь »
Представить файл в HEX-виде [D7, XP]
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 он также не совместим(
Помогите, пожалуйста!