Версия для печати темы
Нажмите сюда для просмотра этой темы в оригинальном формате
Форум программистов > Delphi: Общие вопросы > Указатель типа Pointer - читаем и записываем байты


Автор: Гость_Alex 24.10.2005, 18:24
Коллеги! Есть указатель типа Pointer на некоторую область в памяти. Как прочитать/записать байт по определенному адресу в этой памяти? Т.е. необходимо реализовать две функции типа ReadByte и WriteByte.

Автор: _hunter 24.10.2005, 18:44
читаем в книжке тему про указатели и понимаем что функция нам не нужна. но если очень хочется:
Код

BOOL ReadProcessMemory(
    HANDLE hProcess,    // handle of the process whose memory is read  
    LPCVOID lpBaseAddress,    // address to start reading
    LPVOID lpBuffer,    // address of buffer to place read data
    DWORD nSize,    // number of bytes to read
    LPDWORD lpNumberOfBytesRead    // address of number of bytes read
   );

Автор: p0s0l 24.10.2005, 19:12
ReadProcessMemory - если работа с разными процессами...
Если в чужие процессы не лезем, то целесообразнее использовать Move или CopyMemory...
А на поставленный вопрос ответ такой:
Код

function ReadByte (Address : pointer) : byte;
begin
  Result := Byte(Address^);
end;

procedure WriteByte (Address : pointer; Value : byte);
begin
  Byte(Address^) := Value;
end;

Автор: Гость_Alex 24.10.2005, 20:44
Нет господа, что-то не то. Возможно я не так объяснил… Попробую подробнее: использую файл, отображенный в память (до 10 Мб). Получаю на него указатель Pointer и хочу работать с файлом как с одномерным массивом… Использовать что то типа result:=PByteArray(P)[adr]; на мой, сугубо субъективный взгляд – решение не очень… т.к. заранее неизвестно какого размера буду обрабатывать файл, а ограничивать себя – это не выход. Хочется какой ни будь универсальный подход… или другого выхода нет?

Автор: p0s0l 25.10.2005, 08:55
Цитата
Использовать что то типа result:=PByteArray(P)[adr]; на мой, сугубо субъективный взгляд – решение не очень… т.к. заранее неизвестно какого размера буду обрабатывать файл, а ограничивать себя – это не выход.
Ты про какие ограничения говоришь ? Если про ограничения объявления PByteArray:
Код
  PByteArray = ^TByteArray;
  TByteArray = array[0..32767] of Byte;
то отключи в проекте проверку Range Checking - и можешь работать с хоть с 10 мб, хоть со 100...
Или сделай так:
Код
// Address - адрес отображения
// Offset - смещение (внутри отображения) по которому нужно читать байт

function ReadByte (Address : Pointer; Offset : Integer) : byte;
begin
  Result := Byte((PChar(Address) + Offset)^);
end;

// или

function ReadByte (Address : Pointer; Offset : Integer) : byte;
  Inc (Integer(Address), Offset);
  Result := Byte(Address^);
end;
хотя я бы делал через PByteArray...

Powered by Invision Power Board (http://www.invisionboard.com)
© Invision Power Services (http://www.invisionpower.com)