Главная страница
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.042 c
2-1142685685
Fenix
2006-03-18 15:41
2006.04.02
Добавление иконки на SpeedButton


2-1142574309
Мух
2006-03-17 08:45
2006.04.02
Вопрос про копирование БД


2-1142425631
Fenix
2006-03-15 15:27
2006.04.02
Динамическое создание элементов ListView


1-1141040367
serguar
2006-02-27 14:39
2006.04.02
отладка сервисов NT


15-1142102904
Ehh
2006-03-11 21:48
2006.04.02
Вопрос по web программированию