Буфер

From SunFlurry wiki
Jump to: navigation, search
  Buffer (Буфер)
Статус разработки: Реализован
Создание объекта: Create

Объект буфер используется как хранилище любой бинарной информации. В буфер, к примеру, можно загрузить внешний файл в бинарном формате и разобрать этот формат программно. Объект позволяет чтение и запись данных типа байты (8 бит), слова (16 бит), двойные слова (32 бита), учетверенные слова (64 бит), строки. При записи в буфер, он будет автоматически увеличиваться до нужного размера. Размер буфера всегда измеряется в байтах. Индекс буфера при записи или чтении из него начинается с нуля и также измеряется в количестве байт с начала буфера.

Атрибуты и функции

Идентификатор Статус Тип Визуальная Параметры Описание
[<Индекс буфера (INT)>], [<Индекс буфера (INT)>,<Размер данных (INT)>] Реализована Атрибут Buffer[<Индекс буфера (INT)>,<Размер данных (INT)>=1]:<Данные буфера (INT)> Использование синтаксиса массивов позволяет получить или изменить содержимое буфера по его индексу. Размер данных можно задать вторым аргументом массива.
Create Реализована Функция Buffer.Create(<Исходный размер буфера (INT)>=0):<Новый объект (BUFFER)> Функция возвращает новый объект типа Буфер с нужным начальным размером, если необходимо.
Size Реализована Функция Buffer.Size(<Новый размер буфера (INT)>):<Текущий размер буфера (INT)> Функция возвращает текущий размер буфера, также изменяет этот размер, если задан первый аргумент.
LoadFromFile Реализована Функция Buffer.LoadFromFile(<Путь и имя файла (STRING)>,<Начальная позиция файла (INT)>=0,<Количество байтов для чтения (INT)>,<Индекс буфера (INT)>=0) Функция читает требуемую часть указанного файла в буфер, начиная с указанного индекса. Если в процессе чтения произошла ошибка, функция вызывает исключение.
SaveToFile Реализована Функция Buffer.SaveToFile(<Путь и имя файла (STRING)>,<Индекс буфера (INT)>=0,<Количество байтов для записи (INT)>) Функция сохраняет требуемую часть буфера в указанный файл. Если в процессе чтения произошла ошибка, функция вызывает исключение.
AppendToFile Реализована Функция Buffer.AppendToFile(<Путь и имя файла (STRING)>,<Индекс буфера (INT)>=0,<Количество байтов для записи (INT)>) Функция добавляет требуемую часть буфера к содержимому указанного файла. Если в процессе чтения произошла ошибка, функция вызывает исключение.
GetByte Реализована Функция Buffer.GetByte(<Индекс буфера (INT)>,<Число со знаком (INT)>=0):<Значение (INT)> Функция получает байт (со знаком, если необходимо) из буфера по указанному индексу
GetWord Реализована Функция Buffer.GetWord(<Индекс буфера (INT)>,<Число со знаком (INT)>=0):<Значение (INT)> Функция получает слово (со знаком, если необходимо) из буфера по указанному индексу
GetDWord Реализована Функция Buffer.GetDWord(<Индекс буфера (INT)>,<Число со знаком (INT)>=0):<Значение (INT)> Функция получает двойное слово (со знаком, если необходимо) из буфера по указанному индексу
GetQWord Реализована Функция Buffer.GetQWord(<Индекс буфера (INT)>):<Значение (INT)> Функция получает 64-битное целое число (число всегда будет иметь знак) из буфера по указанному индексу
GetRealNumber Реализована Функция Buffer.GetRealNumber(<Индекс буфера (INT)>,<Тип числа (INT)>=0):<Значение (REAL)> Функция получает вещественное число из буфера по указанному индексу.
SetByte Реализована Функция Buffer.SetByte(<Индекс буфера (INT)>,<Значение (INT)>) Функция сохраняет байт (со знаком или без) в буфер по указанному индексу
SetWord Реализована Функция Buffer.SetWord(<Индекс буфера (INT)>,<Значение (INT)>) Функция сохраняет слово (со знаком или без) в буфер по указанному индексу
SetDWord Реализована Функция Buffer.SetDWord(<Индекс буфера (INT)>,<Значение (INT)>) Функция сохраняет двойное слово (со знаком или без) в буфер по указанному индексу
SetQWord Реализована Функция Buffer.SetQWord(<Индекс буфера (INT)>,<Значение (INT)>) Функция сохраняет 64-битное числовое значение в буфер по указанному индексу
SetRealNumber Реализована Функция Buffer.SetRealNumber(<Индекс буфера (INT)>,<Значение (REAL)>,<Тип числа (INT)>=0) Функция сохраняет вещественное числовое значение в буфер по указанному индексу.
GetString Реализована Функция Buffer.GetString(<Индекс буфера (INT)>,<Размер строки в байтах (INT)>,<Кодовая страница (INT)>=0):<Результирующая строка (STRING)> Функция получает однобайтовую строку в указанной кодировке возвращает ее в виде ANSI строки, если кодовая страница кодировки равна нулю, или в виде UFT-16 строки, если кодовая страница не равна нулю.
SetString Реализована Функция Buffer.SetString(<Индекс буфера (INT)>,<Строка для записи в буфер (STRING)>,<Кодовая страница (INT)>=0) Функция записывает в буфер символы из строки, предварительно перекодировав ее в требуемую кодировку. Будет произведена запись однобайтной строки.
GetStringW Реализована Функция Buffer.GetStringW(<Индекс буфера (INT)>,<Размер строки в символах (INT)>):<Результирующая строка (STRING)> Функция получает UTF-16 (двухбайтную) строку из буфера по указанному индексу.
SetStringW Реализована Функция Buffer.SetStringW(<Индекс буфера (INT)>,<Строка для записи в буфер (STRING)>) Функция записывает в буфер символы из UTF-16 (двухбайтной) строки по указанному индексу.
GetBuffer Реализована Функция Buffer.GetBuffer(<Индекс буфера (INT)>,<Размер в байтах (INT)>):<Результат-буфер (BUFFER)> Функция создает новый объект буфера и заполняет его указанной частью текущего буфера.
CopyTo Реализована Функция Buffer.CopyTo(<Буфер для записи (BUFFER)>,<Индекс текущего буфера для чтения (INT)>,<Количество байт для чтения (INT)>,<Индекс в указанном буфере для записи (INT)>=0) Функция сохраняет другой буфер по указанному адресу требуемую часть из текущего буфера.
Fill Частичная реализация Функция Buffer.Fill(<Индекс буфера (INT)>,<Размер в байтах (INT)>,<Значение для записи (INT)>,<Тип значения (INT)>=0) Функция заполняет указанную часть буфера указанным значением. Значение может быть как байтом, словом, двойным словом, так и четверным словом.
CopyData Реализована Функция Buffer.CopyData(<Индекс начала данных (INT)>,<Размер области в байтах (INT)>,<Индекс назначения копирования (INT)>) Функция копирует данные внутри буфера. Данные копируются начиная с начала отрезка, заканчивая концом отрезка копирования (в прямом направлении). Обычно эта процедура применяется при перемещении данных ближе к началу буфера, при этом, отрезок копирования может пересекаться с отрезком назначения.
CopyDataInverse Реализована Функция Buffer.CopyDataInverse(<Индекс начала данных (INT)>,<Размер области в байтах (INT)>,<Индекс назначения копирования (INT)>) Функция копирует данные внутри буфера. Данные копируются начиная с конца отрезка, заканчивая началом отрезка копирования (в обратном направлении). Обычно эта процедура применяется при перемещении данных дальше к концу буфера, при этом, отрезок копирования может пересекаться с отрезком назначения.
CopyFromSystemMemory Реализована Функция Buffer.CopyFromSystemMemory(<Указатель в системной памяти (INT)>,<Размер данных в байтах (INT)>,<Индекс назначения копирования (INT)>) Функция копирует данные указанного размера из системной памяти в буфер по указанному индексу. Внимание: функция работает с прямыми адресами системной памяти, что может вызвать системное исключение доступа, если адрес недоступен или память не выделена. Системное исключение будет превращено в локальное исключение вызываемое функцией. Функция может использоваться в совокупности с функциями объекта загружаемой системной библиотеки.
CopyToSystemMemory Реализована Функция Buffer.CopyToSystemMemory(<Указатель в системной памяти (INT)>,<Размер данных в байтах (INT)>,<Индекс в буфере для копирования (INT)>) Функция копирует данные из буфера начиная с указанного индекса заданного размера (или до конца буфера) в системную память. Внимание: функция работает с прямыми адресами системной памяти, что может вызвать системное исключение доступа, если адрес недоступен или память не выделена. Системное исключение будет превращено в локальное исключение вызываемое функцией. Подобное копирование может вызвать порчу данных в памяти без создания системного исключения, которое может привести к непредсказуемым последствиям, начиная от внезапного завершения работы клиента, до общесистемного сбоя. Поэтому прежде чем копировать что-то в системную память, необходимо корректно ее выделить. Функция может использоваться в совокупности с функциями объекта загружаемой системной библиотеки.
SystemAddress Реализована Функция Buffer.SystemAddress(<Индекс в буфере (INT)>=0):<Указатель в системной памяти (INT)> Функция возвращает указатель в системной памяти на индексом смещения в буфере. Внимание: при записи информации в буфер, его размер автоматически увеличивается, при этом данные буфера могут перемещаться в памяти, и возвращенный ранее указатель будет указывать на адрес в памяти более не принадлежащий буферу. При записи по этому адресу, данные в памяти будут испорчены, что приведет к непредсказуемым последствиям, начиная от внезапного завершения работы клиента, до общесистемного сбоя. Возвращенный указатель можно использовать только до изменения размеров буфера, после чего необходимо сновать вызвать функцию для получения обновленного указателя. Функция может использоваться в совокупности с функциями объекта загружаемой системной библиотеки.

Объект структуры данных записи

Структура данных запись (MemoryRecord) позволяет получить удобный доступ к бинарным данным в системной памяти или в буфере. Она может использоваться в двух основных случаях:

  • Импорт или экспорт бинарных данных (к примеру, чтение формата BMP или WAV напрямую с диска)
  • Работа с функциями загружаемых системных библиотек. Функции часто работают со структурами данных, которые требуется разбирать или создавать для вызова функций библиотек.

Объект позволяет создать запись любой сложности, однако существуют несущественные ограничения, которые можно легко обойти (в данный момент нельзя создать "массив массивов", требуется разделить массивы по разным записям и использовать одну запись внутри другой). Сама запись представляет структуру, не привязанную к памяти, поэтому после создания ее необходимо либо привязать к буферу (Assign или Allocate), либо непосредственно к адресу системной памяти (AssignToSystemMemory), после чего поля записи становятся доступными для чтения или записи. Дублирование записи осуществляется с помощью функции Copy, при этом сама структура в памяти не дублируется, создается новая привязка к ней, поэтому, такой процесс происходит быстро и не затрачивает дополнительную память.

Для большей информации и примеров см. статью Create.

Идентификатор Статус Тип Визуальная Параметры Описание
<Имя поля>[<Индекс массива (INT)>] Реализована Атрибут MemoryRecord.<Имя поля>[<Индекс массива (INT)>]:<Данные массива> Использование синтаксиса массивов позволяет получить или изменить данные в массивах структуры записей. Запись должна быть привязана к памяти или буферу.
<Имя поля> Реализована Атрибут MemoryRecord.<Имя поля>:<Данные поля> Атрибут позволяет получить или изменить данные по имени поля записи. Запись должна быть привязана к памяти или буферу.
Create Реализована Функция MemoryRecord.Create(<Описание структуры записи (STRING)>,<Привязать созданную запись к буферу (BUFFER)>,<Индекс в буфере (INT)>):<Новый объект записи (MEMORYRECORD)> Функция создает новый объект записи по указанным правилам, привязывая его к существующему буферу, если это необходимо.
Allocate Реализована Функция MemoryRecord.Allocate():<Новый буфер записи (BUFFER)> Функция отвязывает запись от ее текущей привязки, создает новый буфер с размером, совпадающим с размером записи и привязывает запись к новому буферу. Созданный буфер будет заполнен нулевыми байтами.
Buffer Реализована Функция MemoryRecord.Buffer():<Привязанный буфер или системный указатель (BUFFER,INT)> Функция возвращает объект буфера, привязанного к текущей записи, либо системный указатель, если запись привязана к системной памяти. Если запись не привязана, функция возвращает пустое значение.
Assign Реализована Функция MemoryRecord.Assign(<Буфер для привязки (BUFFER)>,<Индекс в буфере (INT)>) Функция отвязывает запись от текущей привязки, и привязывает ее к заданному в аргументе буферу.
AssignToSystemMemory Реализована Функция MemoryRecord.AssignToSystemMemory(<Системный указатель (INT)>) Функция отвязывает запись от текущей привязки, и привязывает ее к заданному в аргументе системному указателю. Внимание: запись, привязанная к системной памяти, работает с прямыми адресами системной памяти, что может вызвать системное исключение доступа, если адрес недоступен или память не выделена.
Copy Реализована Функция MemoryRecord.Copy():<Новый объект записи (MEMORYRECORD)> Функция создает копию структуры записи, и возвращает ее как новую запись. Новая запись не будет привязана.
Size Реализована Функция MemoryRecord.Size():<Размер записи в байтах (INT)> Функция возвращает размер записи в байтах. Запись может быть не привязана.
Index Реализована Функция MemoryRecord.Index(<Наименование поля (STRING)>,<Индекс массива (INT)>=0):<Смещение к данным поля от начала записи в байтах (INT)> Функция возвращает смещение указанного поля в байтах от начала записи (для полей-массивов также можно указать индекс массива). Запись может быть не привязана. Важно понимать, что для записей, входящих в другие записи, будет возвращено смещение от начала текущей записи, а не ее родителя.
SystemAddress Реализована Функция MemoryRecord.SystemAddress(<Наименование поля (STRING)>,<Индекс массива (INT)>=0):<Системный адрес к данным поля (INT)> Функция возвращает системный указатель на указанное имя поля (для полей-массивов также можно указать индекс массива). Запись должна быть привязана. Внимание: использование системных указателей опасно, запись или чтение может вызвать системное исключение доступа, если адрес недоступен или память не выделена.