Главная страница
    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.45 MB
Время: 0.044 c
15-1141919810
Tria
2006-03-09 18:56
2006.04.02
Подскажите пож. прогу для создания обучающих роликов.


15-1142062536
zac
2006-03-11 10:35
2006.04.02
микрофон


15-1142317244
ВСА
2006-03-14 09:20
2006.04.02
Холодильник


10-1114464197
agisland
2005-04-26 01:23
2006.04.02
Диаграммы Excel


4-1137083617
Arazel
2006-01-12 19:33
2006.04.02
Перезагрузка системы без выхода в Out!





Afrikaans Albanian Arabic Armenian Azerbaijani Basque Belarusian Bulgarian Catalan Chinese (Simplified) Chinese (Traditional) Croatian Czech Danish Dutch English Estonian Filipino Finnish French
Galician Georgian German Greek Haitian Creole Hebrew Hindi Hungarian Icelandic Indonesian Irish Italian Japanese Korean Latvian Lithuanian Macedonian Malay Maltese Norwegian
Persian Polish Portuguese Romanian Russian Serbian Slovak Slovenian Spanish Swahili Swedish Thai Turkish Ukrainian Urdu Vietnamese Welsh Yiddish Bengali Bosnian
Cebuano Esperanto Gujarati Hausa Hmong Igbo Javanese Kannada Khmer Lao Latin Maori Marathi Mongolian Nepali Punjabi Somali Tamil Telugu Yoruba
Zulu
Английский Французский Немецкий Итальянский Португальский Русский Испанский