![]() |
| ||
|
|
Новости |
Поиск |
FAQ |
Статьи |
Книги |
Новости VCL
| | Форумы ЧАТ |
Орешник |
|
| |||
| |||
« предыдущая ветвь | форум | следующая ветвь »
Работа с буффером
Новичоккк © (2006-03-20 13:25:00)Есть буффер, создаваемый какой-то функцией. Есть переменные:
var
Buf: Pointer;
Size: Cardinal;
Как получить доступ к определенному байту буффера? Вот так работает:
Char(Pointer((Integer(buf)+i))^)
Но смотрится уж больно страшно
Попытался сделать вот так:
var
buf
m: array of char;
begin
m:=buf;
m[i]:='A';
...
Но почему-то возникают ошибки при выполнении.
Как быть?
MBo (2006-03-20 13:40:00) [1]var c: PChar;
c:=Buf;
c[i]...
Новичоккк (2006-03-20 13:38:00) [2]
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:00) [3]
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 - это ведь указатель на начало массива. Почему все-таки не работает?
TUser (2006-03-20 13:34:00) [4]> KLAUS © (20.03.06 13:31) [2]
Да, если уж на Delphi - то байтик по нужному смещению без TStream никак не заменить, причем почему-то из всех его наследников надо испольовать именно TFileStream. Куда мир катится?
KLAUS (2006-03-20 13:31:00) [5]Ну если ты знаешь, адрес этото байта и хочешь его заменить:
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:28:00) [6]> Char(Pointer((Integer(buf)+i))^)
> Но смотрится уж больно страшно
Не бойся - это Паскаль. Можешь еще написать так
type
TChars = array of char;
PChars = ^TChars;
var C: PChars;
...
C:=PChars (Buf)
C[i] - это будет твой char