Форум программистов
 

Восстановите пароль или Зарегистрируйтесь на форуме, о проблемах и с заказом рекламы пишите сюда - alarforum@yandex.ru, проверяйте папку спам!

Вернуться   Форум программистов > Delphi программирование > Общие вопросы Delphi
Регистрация

Восстановить пароль
Повторная активизация e-mail

Купить рекламу на форуме - 42 тыс руб за месяц

Ответ
 
Опции темы Поиск в этой теме
Старый 07.12.2010, 01:51   #1
virtuhay266
Пользователь
 
Регистрация: 28.05.2009
Сообщений: 57
По умолчанию вычисление кластеров файла

Всем привет! Есть проблема - нужно написать процедурку реализующую следующее:
Дана последовательность байт неизвестной длины (например 31 01 FF FF 0B 31 03 3C B3 FB). Младшая тетрада первого байта (1) показывает сколько байт занимает длина отрезка кластеров (дли на отрезка 01), старшая тетрада первого байта (3) показывает сколько байт занимает начальный кластер (0B FF FF). Отрезок получается 0B FF FF : (0B FF FF + 01 - 1), т.е. 0B FF FF : 0B FF FF. Следующий отрезок начинается с (младшая тетрада первого байта + старшая тетрада первого байта + 1). И он вычисляется также, только к начальному отрезку прибавляется 0B FF FF, т.е.
FB B3 3C + 0B FF FF, а соль в том что числа трех байтовые и FB B3 3C - отрицательное, если использовать dword нужно расширить знак. Помогите пожалуйста написать процедуру, хотя бы идеями.

Если интересно вот оригинальный текст:
Цитата:
Нерезидентные атрибуты. Для таких атрибутов флаг non_resident установлен в 1 и их тела хранятся в отдельных кластерах, на которые указывают отрезки. Отрезок (run) хранит цепочки кластеров, в которых находится содержимое атрибута. Массив отрезков называется списком отрезков (run list). Если атрибут имеет один отрезок, то он не фрагментирован и, соответственно, все кластеры, которые содержат данные являются смежными. Смещение списка отрезков определяется суммой смещения заголовка атрибута и поля nr.mapping_pairs_offset.
Отрезки находятся в сжатом виде и содержат сопоставления LCN-VCN для кластеров. Набор отрезков, описывающих кластеры для атрибута называется списком отрезков (run list). Поле mapping_pairs_offset в заголовке нерезидентного атрибута содержит смещение списка отрезков от начала заголовка атрибута. Фактически, список отрезков это массив структур переменного размера. Размер каждого из полей структуры указывается в предыдущем байте. Первый элемент структуры содержит размер отрезка в кластерах, а второй номер кластера. Байт, описывающий размеры полей размера и номера кластеров условимся называть байтом длин. Младший полубайт байта длин содержит длину поля размера, а старший длину поля номера кластера. Данные в полях структуры хранятся в формате Intel, т. е. младший байт по младшему адресу.
Рассмотрим пример. Нерезидентный атрибут имеет список отрезков вида.
32 90 3A 00 00 0C | 32 30 0F DA A7 1B | 32 A0 36 5E 89 05 | 00
Первый байт – байт длин описывает длины полей первого отрезка. Младший полубайт равен 2, значит на поле длины приходится два байта и длина отрезка равна 0x3A90. Далее, старший полубайт байта длин равен трем и стартовый кластер равен 0xC0000. Получаем первый отрезок начинается с кластера 0xC0000 и заканчивается границей 0xC0000 + 0x3A90 = C3A90. Для перехода к следующему элементу следует прибавить размеры полей, и единицу для байта длин, т. е. 3 + 2 + 1. Для второго отрезка по байту длин видим, что размер полей такой же как в предыдущем отрезке, т. е. младший полубайт равен двойке, значит размер поля длины два и равен 0xF30, старший полубайт равен трем и стартовый VCN равен 0x1BA7DA. Для преобразования VCN в LCN, складываем первый LCN - 0xC0000 и VCN - 0x1BA7DA. Получаем 0xC0000 + 0x1BA7DA = 0x27A7DA. Получаем, второй отрезок начинается с кластера 0x27A7DA и продолжается до 0x27A7DA+0xF30 = 0x27B70A. Для перехода к следующему отрезку добавляем размеры полей плюс единицу для самого байта длин. Третий отрезок начинается с байта длин - 32 и размер в кластерах отрезка равен 0x36A0, VCN равен 0x5895E. Для преобразования VCN-LCN складываем предыдущий стартовый LCN с данным VCN, т. е. 0x27A7DA + 0x5895E = 0x2D3138. Получаем третий отрезок 0x2D3138 - 2D67D8. Следующий байт за отрезком нулевой, следовательно список отрезков закончен. Итак исходный атрибут размещается в кластерах 0xC0000 – 0xC3A90, 0x27A7DA - 0x27B70A, 0x2D3138 – 0x2D67D8 (не включая последний кластеры).

Последний раз редактировалось virtuhay266; 07.12.2010 в 01:55.
virtuhay266 вне форума Ответить с цитированием
Ответ


Купить рекламу на форуме - 42 тыс руб за месяц



Похожие темы
Тема Автор Раздел Ответов Последнее сообщение
Список кластеров файла (NTFS, Ext3, Ext4) Codogenerator Помощь студентам 4 18.12.2010 19:19
Цепочка кластеров файла в FAT32 virtuhay266 Помощь студентам 2 25.11.2010 16:28
Работа с файловой системой, получение номеров кластеров занятых файлом (assembler) Goenich Помощь студентам 3 03.06.2009 16:40
вычисление f(x) felmor Паскаль, Turbo Pascal, PascalABC.NET 0 24.12.2008 22:11
Выделение кластеров varvara16 Помощь студентам 2 23.04.2008 19:12