Главная страница
Top.Mail.Ru    Яндекс.Метрика
Текущий архив: 2006.04.02;
Скачать: CL | DM;

Вниз

Работа с буффером   Найти похожие ветки 

 
Новичоккк   (2006-03-20 13:25) [0]

Есть буффер, создаваемый какой-то функцией. Есть переменные:
var
Buf: Pointer;
Size: Cardinal;

Как получить доступ к определенному байту буффера? Вот так работает:
Char(Pointer((Integer(buf)+i))^)
Но смотрится уж больно страшно
Попытался сделать вот так:
var
 buf
 m: array of char;
begin
 m:=buf;
 m[i]:="A";
...

Но почему-то возникают ошибки при выполнении.
Как быть?


 
TUser ©   (2006-03-20 13:28) [1]

> Char(Pointer((Integer(buf)+i))^)
> Но смотрится уж больно страшно

Не бойся - это Паскаль. Можешь еще написать так
type
TChars = array of char;
PChars = ^TChars;

var C: PChars;

...

C:=PChars (Buf)
C[i] - это будет твой char


 
KLAUS ©   (2006-03-20 13:31) [2]

Ну если ты знаешь, адрес этото байта и хочешь его заменить:
PEFile:=tfilestream.Create(Edit1.Text,fmOpenReadWrite);
size:=pefile.Size;
getmem(buf,size);
pefile.Read(buf^,size);
b:=$D2;
pefile.Seek(i,sofrombeginning);
pefile.Write(b,1);

В данном случае i адрес байта


 
TUser ©   (2006-03-20 13:34) [3]

> KLAUS ©   (20.03.06 13:31) [2]

Да, если уж на Delphi - то байтик по нужному смещению без TStream никак не заменить, причем почему-то из всех его наследников надо испольовать именно TFileStream. Куда мир катится?


 
Новичоккк   (2006-03-20 13:38) [4]

procedure EditBuf(Buf: Pointer; Size: Cardinal);
type
TChars = array of char;
PChars = ^TChars;
var
m:PChars;
i:integer;
begin
m:=PChars(Buf);
for i:=0 to Size-1 do
  begin
   if m[i]="X" then ...
  end;
end;

Не работает. Пишет "Array type required".

2KLAUS
Спасибо. Попробую воспользоваться этим. Только не очень удобно.

Неужели нельзя работать с буффером, как с массивом?
var
buf
m: array of char;
begin
m:=buf;
m[i]:="A";
...

Теоритически m - это ведь указатель на начало массива. Почему все-таки не работает?


 
Новичоккк   (2006-03-20 13:38) [5]

procedure EditBuf(Buf: Pointer; Size: Cardinal);
type
TChars = array of char;
PChars = ^TChars;
var
m:PChars;
i:integer;
begin
m:=PChars(Buf);
for i:=0 to Size-1 do
  begin
   if m[i]="X" then ...
  end;
end;

Не работает. Пишет "Array type required".

2KLAUS
Спасибо. Попробую воспользоваться этим. Только не очень удобно.

Неужели нельзя работать с буффером, как с массивом?
var
buf
m: array of char;
begin
m:=buf;
m[i]:="A";
...

Теоритически m - это ведь указатель на начало массива. Почему все-таки не работает?


 
MBo ©   (2006-03-20 13:40) [6]

var c: PChar;

c:=Buf;
c[i]...



Страницы: 1 вся ветка

Текущий архив: 2006.04.02;
Скачать: CL | DM;

Наверх




Память: 0.48 MB
Время: 0.046 c
15-1142236865
Alex_Delphi
2006-03-13 11:01
2006.04.02
Где достать исходник к InterBase 6.0.


15-1142180747
Necromantos
2006-03-12 19:25
2006.04.02
Прога для вычисления Iq


9-1127579027
E
2005-09-24 20:23
2006.04.02
OpenGL и текстуры


4-1137428016
sicilla
2006-01-16 19:13
2006.04.02
Доступ к com1


15-1141913753
Dok_3D
2006-03-09 17:15
2006.04.02
Фильтры для водопроводной воды