Исходник программы, показывающей пример отображения содержимого файлов в шестнадцатеричном формате (основание 16).
Существует 16 шестнадцатеричных цифр со значениями от 0 до 15, для удобства они помечены от «0» до «9» и от «A» до «F». Каждая шестнадцатеричная цифра также может быть записана 4 двоичными битами (от 0000 до 1111).
Шестнадцатеричные числа удобны для использования при отображении памяти компьютера или файлов, поскольку две из этих 4-битных шестнадцатеричных цифр могут представлять базовую единицу хранения в памяти, 8-битный «байт».
Использование программы говорит само за себя: выберите файл для просмотра и используйте клавиши PgUp, PgDn для пролистывания. Ctrl + PgUp перейдет на страницу 1, Ctrl + PgDn перейдет на последнюю страницу. Клавиша выхода «Esc» закроет файл. Символы, которые представляют допустимые символы, будут отображаться в каждой строке рядом с шестнадцатеричными данными.
Заметки для программистов
Элемент управления TFileStream используется для доступа к отображаемому файлу. Чтобы избежать проблем с памятью при работе с большими файлами, объем данных (BufLen) для заполнения страницы рассчитывается для каждой операции отображения на основе текущего размера элемента управления TMemo. Для каждой страницы процедура ShowPage ищет начало следующей отображаемой страницы (CurPage * BufLen) и считывает байты данных BufLen. Hexchars - это массив, содержащий метки из 16 шестнадцатеричных символов. Код Delphi использует цикл для N и J для преобразования каждого байта каждой строки в два отображаемых символа и добавления его в строку Hex. N отражает позицию начала текущей строки в буфере, а J указывает на текущий преобразуемый символ. Строка преобразования кода выглядит так:
hex: = шестнадцатеричный + шестнадцатеричный символ [(буфер [n + j] и $ F0) shr 4] + шестнадцатеричный символ [(буфер [n + j] и $ 0F)];
Левый «полубайт» (4 бита байта) преобразуется «и» с шестнадцатеричным F0 (11110000 двоичный), чтобы очистить правый полубайт, а затем сдвигается вправо (= делится на 16), чтобы вернуть его обратно. диапазон 0-15, который затем используется как индекс в массиве Hexchars. Правая половина прикуса затем преобразуется аналогичным образом, за исключением того, что делить на 16 нет необходимости.
Отображаемые строки добавляются в TStringlist (список), строки которого назначаются свойству Memo1.Lines после построения страницы. Это устранило проблему мерцания, которая возникала, когда строки были встроены непосредственно в Memo1.
Еще одна интересная проблема, с которой я столкнулся и которая может сэкономить вам время в будущем. Когда элемент управления выравнивается по нижнему краю формы (например, элемент управления TStatictext в этом случае) и форма изменяется до меньшей высоты, элемент управления размещается под всеми существующими элементами управления. Регулировать размеры в выходе OnResize слишком поздно, чтобы предотвратить эту проблему. Решение состоит в том, чтобы использовать выход OnCanResize, чтобы предсказать, где будет находиться нижний выровненный элемент управления, и перенастроить размер и верхнюю часть других элементов управления до фактической операции изменения размера.