В предыдущем разделе рассказывалось о том, как на компьютерах хранятся числовые данные, но мы также должны подумать о хранении строковых данных, то есть отдельных символов и целых предложений. На практике для хранения символьных данных чаще всего применяется кодировка А5СН или Цтсос1е. Кодировка АБСН проще, поэтому начнем с нее. В АБСН каждый символ английского языка обозначается числовым кодом. Например, букве А соответствует код 0x41, а символу & - код 0x26. Наибольшее определенное значение равно 0х7Е; таким образом, любой символ базового набора представляется одним байтом. Многие коды соответствуют управляющим символам и не имеют печатного представления - например, звуковой сигнал 0x07. В табл. 2.2 приведены соответствия между шестнадцатеричными числами и символами АБСИ. Более подробная таблица АБСН-кодов приводится по адресу: http://www.asciitable.com/.

Чтобы сохранить предложение или слово в кодировке ASCII, необходимо выделить под него область памяти, размер которой в байтах соответствует количеству символов в слове. В каждом байте хранится код одного символа. Порядок байтов в этом случае роли не играет, потому что каждый символ представлен отдельным 1-байтовым кодом. Таким образом, первый символ слова или предложения всегда находится на первом месте. Последовательность байтов в слове или предложении называется строкой (string). Строки часто завершаются нуль-символом (NULL), соответствующим коду 0x00. На рис. 2.6 показан пример строки, хранящейся в кодировке ASCII. Строка состоит из 10 символов и завершается нуль-символом, поэтому для ее хранения выделяется 11 байт, начиная с байта 64.

Рис. 2.6. АБСН-строка, хранящаяся в памяти, начиная с адреса 64

Кодировка А5СИ проста и удобна, если ваши потребности ограничиваются английским алфавитом. Однако для пользователей из других стран мира ее явно недостаточно, поскольку АБСП не позволяет представлять символы национальных алфавитов. Для решения этой проблемы была создана кодировка Цпісосіе, в которой числовой код символа занимает более 1 байта (за подробностями обращайтесь на сайт www.unicode.org). Версия 4.0 стандарта Цпісосіе поддерживает более 96 000 символов, при этом для представления одного символа необходимы 4 байта (вместо 1 байта в АБСИ).

Существует три варианта хранения символов Цпісосіе. В первом варианте - иТР-32 - каждый символ представляется 4 байтами, но при этом большая часть памяти будет расходоваться неэффективно. Во втором варианте, ЦТР-16, часто используемые символы хранятся в 2-байтовых кодах, а более редкие - в 4-байтовых, поэтому в среднем текст занимает меньший объем, чем в ЦТР-32. Третий вариант называется ЦТР-8, и один символ в нем представляется 1, 2 или 4 байтами. При этом наиболее часто используемые символы кодируются всего 1 байтом.

Переменная длина кода в ЦТР-8 и ЦТР-16 несколько усложняет обработку данных. На практике чаще используется ЦТР-8, поскольку в этой кодировке меньше места расходуется напрасно, а АБСІІ является ее подмножеством. Если строка ЦТР-8 состоит только из АБСН-символов, каждый символ в ней кодируется 1 байтом, а по своему содержимому такая строка совпадает с эквивалентной АБСИ-строкой.

Структуры данных

Прежде чем переходить к особенностям хранения данных в конкретных файловых системах, необходимо познакомиться с общими принципами организации данных. Вернемся к предыдущему примеру, в котором проводилась аналогия между цифровыми данными и квадратиками на бумажной анкете. Когда вы заполняете анкету, надпись перед полем указывает, что данное поле предназначено для ввода имени или адреса. Как правило, компьютеры не снабжают данные файловых систем подобными метками. Вместо этого они просто знают, что в первых 32 байтах записи хранится (к примеру) имя, а в следующих 32 байтах - название улицы.

Способ размещения данных в памяти определяется структурами данных. Структура данных напоминает шаблон или карту. Она делится на поля, при этом каждое поле обладает определенным размером и именем (хотя эта служебная информация не хранится вместе с данными). Например, структура данных может определить, что первое поле называется number и имеет длину в 2 байта. В программе это поле будет использоваться для хранения номера дома в адресе. Сразу же за полем number следует поле street, длина которого равна 30 байтам. Соответствующая структура данных показана в табл. 2.3.

Таблица 2.3. Простая структура данных для хранения номера дома и названия улицы

Диапазон байтов

Описание

0-1

Номер дома (2 байта)

2-31

Название улицы в кодировке АБСІІ (30 байт)

Когда данные требуется записать на носитель информации, область памяти для каждого компонента записи определяется по соответствующей структуре данных. Например, если требуется сохранить адрес 1 Main St., сначала адрес разбивается на составляющие: номер дома и название улицы. Число 1 записывается в байты 0-1 выделенного блока, а строка «Main St.» - в байты 2-9 в виде ASCII-кодов каждого символа. Остальные байты можно обнулить, так как в данном примере они не используются. 32 байта, выделенные для хранения данных, могут располагаться в любом месте устройства. Смещения задаются относительно начала выделенного блока. Не забывайте, что очередность байтов в номере дома зависит от порядка байтов на компьютере.

При чтении данных с носителя информации мы определяем, с какого адреса они начинаются, а затем по структуре данных узнаем смещение нужных данных. Для примера давайте прочитаем только что записанные данные. Выходные данные утилиты, читающей физические данные с диска, выглядят так:

00000000: 0100 4d61 696е 2053 742е 0000 0000 0000 ..Main St.......

00000016: 0000 0000 0000 0000 0000 0000 0000 0000 ................

00000032: 1900 536f 7574 6820 5374 2е00 0000 0000 ..South St......

00000048: 0000 0000 0000 0000 0000 0000 0000 0000 ................

Результат получен от утилиты UNIX xxd, напоминающей графический шестнадцатеричный редактор. В левом столбце приводится смещение в байтах, в средних 8 столбцах - 16 байт данных в шестнадцатеричной форме, а в последнем столбце --их представление в кодировке ASCII. Символами «.» обозначается отсутствие печатных ASCII-символов в данной позиции. Вспомните, что каждый 16-разряд-ный символ представляет 5 бита, поэтому на один байт требуется 2 шестнадцатеричных символа.

Просматривая раскладку структуры данных, мы видим, что каждый адрес занимает 32 байта, поэтому первый адрес хранится в байтах 0-31. Байты 0-1 предназначены для хранения 2-байтового номера дома, а байты 2-31 - для названия улицы. В байтах 0-1 отображается значение 0x0100. Данные взяты из системы Intel, использующей прямой порядок байтов, поэтому 0x01 и 0x00 необходимо поменять местами - получаем 0x0001. Преобразование к десятичному виду дает число 1.

Второе поле структуры данных занимает байты 2-31. Содержащаяся в нем ASCII-строка не зависит от порядка байтов в системе, поэтому переставлять данные не придется. Мы можем либо преобразовать каждый байт в ASCII-эквивалент, либо схитрить и сразу заглянуть в нужные столбцы, чтобы найти в них название «Main St.». Именно это значение было записано ранее. Из приведенного вывода следует, что другая структура данных начинается с байта 32 и продолжается до байта 63. Попробуйте самостоятельно обработать ее для практики (она соответствует адресу «25 South St.»).

Разумеется, в структурах данных файловых систем хранится совершенно иная информация, но базовые принципы остаются прежними. Например, в первом секторе файловой системы обычно хранится большая структура данных с десятками полей; читая ее, мы знаем, что размер файловой системы хранится в байтах 32-35. Во многих файловых системах задействовано несколько больших структур данных, используемых в разных местах.

Размеры данных | Криминалистический анализ файловых систем | Флаги


Криминалистический анализ файловых систем



Новости за месяц

  • Март
    2020
  • Пн
  • Вт
  • Ср
  • Чт
  • Пт
  • Сб
  • Вс