Модераторы: Poseidon, Snowy, bems, MetalFan
  

Поиск:

Ответ в темуСоздание новой темы Создание опроса
> Указатель типа Pointer - читаем и записываем байты, Работа с указателем типа Pointer 
:(
    Опции темы
Гость_Alex
Дата 24.10.2005, 18:24 (ссылка)    |    (голосов: 0) Загрузка ... Загрузка ... Быстрая цитата Цитата


Unregistered











Коллеги! Есть указатель типа Pointer на некоторую область в памяти. Как прочитать/записать байт по определенному адресу в этой памяти? Т.е. необходимо реализовать две функции типа ReadByte и WriteByte.
  Вверх
_hunter
Дата 24.10.2005, 18:44 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Эксперт
****


Профиль
Группа: Участник Клуба
Сообщений: 8564
Регистрация: 24.6.2003
Где: Europe::Ukraine:: Kiev

Репутация: 15
Всего: 98



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

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
   );



--------------------
Tempora mutantur, et nos mutamur in illis...
PM ICQ   Вверх
p0s0l
Дата 24.10.2005, 19:12 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Г-н Посол
****


Профиль
Группа: Экс. модератор
Сообщений: 3668
Регистрация: 13.7.2003
Где: 58°38' с.ш. 4 9°41' в.д.

Репутация: 58
Всего: 112



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

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

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



--------------------
С уважением, г-н Посол.
PM   Вверх
Гость_Alex
Дата 24.10.2005, 20:44 (ссылка)    |    (голосов: 0) Загрузка ... Загрузка ... Быстрая цитата Цитата


Unregistered











Нет господа, что-то не то. Возможно я не так объяснил… Попробую подробнее: использую файл, отображенный в память (до 10 Мб). Получаю на него указатель Pointer и хочу работать с файлом как с одномерным массивом… Использовать что то типа result:=PByteArray(P)[adr]; на мой, сугубо субъективный взгляд – решение не очень… т.к. заранее неизвестно какого размера буду обрабатывать файл, а ограничивать себя – это не выход. Хочется какой ни будь универсальный подход… или другого выхода нет?
  Вверх
p0s0l
Дата 25.10.2005, 08:55 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Г-н Посол
****


Профиль
Группа: Экс. модератор
Сообщений: 3668
Регистрация: 13.7.2003
Где: 58°38' с.ш. 4 9°41' в.д.

Репутация: 58
Всего: 112



Цитата
Использовать что то типа 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...


--------------------
С уважением, г-н Посол.
PM   Вверх
  
Ответ в темуСоздание новой темы Создание опроса
Правила форума "Delphi: Общие вопросы"
SnowyMetalFan
bemsPoseidon
Rrader

Запрещается!

1. Публиковать ссылки на вскрытые компоненты

2. Обсуждать взлом компонентов и делиться вскрытыми компонентами

  • Литературу по Дельфи обсуждаем здесь
  • Действия модераторов можно обсудить здесь
  • С просьбами о написании курсовой, реферата и т.п. обращаться сюда
  • Вопросы по реализации алгоритмов рассматриваются здесь
  • 90% ответов на свои вопросы можно найти в DRKB (Delphi Russian Knowledge Base) - крупнейшем в рунете сборнике материалов по Дельфи


Если Вам понравилась атмосфера форума, заходите к нам чаще! С уважением, Snowy, MetalFan, bems, Poseidon, Rrader.

 
0 Пользователей читают эту тему (0 Гостей и 0 Скрытых Пользователей)
0 Пользователей:
« Предыдущая тема | Delphi: Общие вопросы | Следующая тема »


 




[ Время генерации скрипта: 0.0451 ]   [ Использовано запросов: 22 ]   [ GZIP включён ]


Реклама на сайте     Информационное спонсорство

 
По вопросам размещения рекламы пишите на vladimir(sobaka)vingrad.ru
Отказ от ответственности     Powered by Invision Power Board(R) 1.3 © 2003  IPS, Inc.