Hex редакторе что это

Три системы счисления — практическое использование.

Три системы счисления широко используются в программировании и отладке уже созданных программ.

Шестнадцатеричный (HEX) код удобен для современных процессоров, которые фактически развиваются на основе 16-ти разрядного процессора для персональных компьютеров Intel i8086. В исходных текстах программ практически всех языков программирования цифра обозначает по умолчанию число в десятичной системе счисления (DEC).

Десятичная система счисления более удобна (хотя и не всегда) при написании кода программ, шестнадцатеричная — неотъемлемая часть отладки, взлома, реверсивного программирования.

Двоичная система счисления (BIN) используется в основном при расстановке флагов определённых стилей объектов Windows (стили окон), но об этом попозже. Рассматривая 16 битное число в виде двоичного мы получаем великолепную возможность получить крохотный по размеру набор 16 флагов, где 1 — флаг установлен 0 — флаг снят (например, шестнадцатеричное число 4 000 соответствует двоичному 0100 0000 0000 0000 — установлен второй флаг, остальные сняты; шестнадцатеричное число 3000 соответствует двоичному числу 0011 0000 0000 0000 — установлены третий и четвёртый флаги, остальные сняты ).

Если мы хотим обозначить принадлежность числа к 16-тиричной системе счисления, то:
1. Ассемблер — добавляем к числу постфикс h (H), например: 100h = 256, 10H=16. Иногда для понимания того, что мы имеем дело с числом, в качестве префикса ставят 0 (ноль).
2. Си (С++) к числу добавляется суффикс 0x (0X).

Например: 0x100 = 100h = 0100h = 256, 0x10 = 10H = 010H = 16

Как открыть файл HEX

Далеко не все являются программистами, и иногда открыть файл с расширением HEX может понадобиться обычному человеку, чтобы посмотреть в нём некую информацию. На самом деле для такой простой задачи вполне достаточно обычного Блокнота – стандартного приложения, которое имеется в любой системе Windows. Ведь этот файл, по сути, является текстовым, просто в нём записана специфическая информация, но обычными символами.

Для этого достаточно кликнуть на файле правой кнопкой мыши, выбрать в меню пункт «Открыть» или «Открыть с помощью», затем «Выбрать из списка установленных программ», а далее просто выбрать стандартный Блокнот. Снимите галочку с пункта «Использовать выбранную программу для всех файлов этого типа» — вдруг вы его потом будете открывать другой программой. Можно просто открыть Блокнот, а файл в него перетащить, и он откроется.

Гораздо удобнее для открытия таких файлов подходит другая версия Блокнота – Notepad++. Скачать можно по этой ссылке. Эта программа также есть у многих, так как более удобна. Но она может к тому же распознавать многие языки программирования и файлы HEX в ней выглядят гораздо удобнее, так как есть выделение цветом. Notepad++ представляет собой как бы примитивный HEX-редактор, и этим можно пользоваться совершенно свободно.

Так выглядит HEX-файл, открытый в Notepad++. В стандартном Блокноте так же, но без цвета.

А теперь рассмотрим более подробно, для чего может понадобиться открывать, а тем более изменять файлы с шестнадцатеричным содержимым. Кстати, если вы собираетесь делать это часто, то лучше скачайте и установите специальный HEX-редактор – их в Интернете довольно много. Некоторые из них подробнее рассматриваются далее.

Взлом игр и файлов

Популярная причина, по которой вы можете использовать шестнадацтеричный редактор, – взлом игр. Вы можете загрузить документ сохранения игры и изменить сумму денег, например, от 1000 до 1000000 долларов. В более поздних играх всё сделано намного сложнее. Многие современные игры используют либо сжатие, либо шифрование, что во много раз затрудняет декомпиляцию состояния сохранения или игры. Тем не менее, некоторые игры по-прежнему позволяют редактировать определённые переменные, например, Sonic Spinball. В дополнение к просмотру файлов игры, из сохранённого файла иногда можно извлечь другую важную информацию, к которой у вас иначе не было бы доступа. Это сильно зависит от типа файла и того, какую информацию вы ищете, но использование шестнадцатеричного редактора полезно для определения того, что именно находится в документе.

Отладка и редактирование

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

Обработка «Распознавание штрихкода с помощью утилиты Zbar» для Документооборот ред. 2 Промо

В связи с тем, что стандартный функционал программы «Документооборот» ред. 2.1 дает возможность распознавания штрихкодов только форма EAN-13, данная обработка — альтернативный способ для распознавания штрихкода в программе 1С: Документооборот ред. 2 с помощью утилиты Zbar, которая распознает в том числе и в формате Code 128 (один из стандартных штрихкодов кодирования документов, например, «Управление торговлей» ред. 11), а также с возможностью поэтапно проследить все действия от распознавания до прикрепления к документу или простой загрузки в каталоги файлов в базе 1С.

5 стартмани

HEX / HTML

Цвет в формате HEX — это ни что иное, как шестнадцатеричное представление RGB.

Цвета представляются в виде трёх групп шестнадцатеричных цифр, где каждая группа отвечает за свой цвет: #112233, где 11 — красный, 22 — зелёный, 33 — синий. Все значения должны быть между 00 и FF.

Во многих приложениях допускается сокращённая форма записи шестнадцатеричных цветов. Если каждая из трёх групп содержит одинаковые символы, например #112233, то их можно записать как #123.

  1. h1 { color: #ff0000; } /* красный */
  2. h2 { color: #00ff00; } /* зелёный */
  3. h3 { color: #0000ff; } /* синий */
  4. h4 { color: #00f; } /* тот же синий, сокращённая запись */

Выбор редактора

Самым первым обычно возникает вопрос: какой редактор из всего многообразия существующих выбрать. Для изменения нескольких байт можно cмело использовать любой, но при частом или длительном использовании программа должна поддерживать все требуемые функции, быть удобной, быстрой и надежной. Исходя из этого можно рекомендовать к использованию, например, QView. Кроме перечисленных выше cвойств, он обладает следующими:

  • Работает в DOS и Windows
  • Содержит встроенные ассемблер и дизассемблер
  • Поддерживает кодировки текста DOS-866, Win-1251, KOI-8r и определяемые пользователем
  • Имеет широкие возможности настройки
  • Является бесплатным с открытыми исходными кодами

Основное окно QView состоит из заголовка (вверху), рабочей области и панели функциональных клавиш (внизу). Для управления используются клавиатура и мышь. QView позволяет работать с данными в текстовом режиме, режиме шестнадцатеричного дампа и режиме дизассемблера. Режимы последовательно переключаются нажатием Enter или F4 (или щелчком левой кнопки мыши по заголовку в области расположения символов AV/HV/00). Режимы просмотра и редактирования переключаются нажатием Alt-F3 (в текстовом режиме — просто F3). Устанавливаемые после запуска режимы зависят от настроек, которые хранятся в файлах qview.ini, qview.fmg, qview.ehl и для изменения которых в составе пакета есть специальная программа — Q-Setup. Контекстная справка по используемым клавишам вызывается нажатием F1.

Открыть файл в редакторе можно передав его имя в качестве параметра командной строки: qview.exe <filename.ext> (в Windows длинные имена файлов необходимо заключать в двойные кавычки) либо через файловую панель, которая вызывается нажатием Alt-F6 или щелчком мыши по имени файла в заголовке. Для выхода из редактора следует нажать Escape.

Создание и использование crack-файлов

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

00000150: 89 B8
00000151: 1E 03
00000152: F6 00
00000153: 10 CD
00000154: 83 10

Иногда в начало добавляется комментарий, начинающийся с символа ‘#’.

В QView для сохранения внесенных в файл изменений в виде crack-файла необходимо нажать Shift-F9, ввести в открывшемся окне имя файла и нажать Enter. Для внесения изменений из готового crack-файла cледует нажать Ctrl-F8, пропустить открывшемся окно, нажав Enter (в нем можно задать дополнительное смещение, что используется редко), в следующем окне ввести имя crack-файла и снова нажать Enter

Важное замечание: сразу после этого изменения будут записаны в файл и он будет автоматически сохранен. Переключать программу в режим редактирования не обязательно. Если при внесении изменений выводится сообщение об ошибке, значит, либо формат файла не соответствует стандартному, либо патч не подходит к файлу (байты «до изменения» не совпадают).

Если при внесении изменений выводится сообщение об ошибке, значит, либо формат файла не соответствует стандартному, либо патч не подходит к файлу (байты «до изменения» не совпадают).

Общие сведения о проблемах с HEX

Общие проблемы с открытием файлов HEX

Heaventools FlexHex нет

При попытке загрузить HEX-файл появляется сообщение, например «Не удается открыть HEX-файлы». Если это так, это обычно связано с тем, что у вас нет Heaventools FlexHex для %%os%%, установленного на вашем компьютере. Типичный путь открытия документа HEX двойным щелчком не будет работать, так как %%os%% не может установить подключение к программе.

Совет: Другая программа, связанная с HEX, может быть выбрана, чтобы открыть файл, нажав «Показать приложения» и найдя приложение.

Неверная версия Heaventools FlexHex

Файл Hexadecimal Source File несовместим с Heaventools FlexHex, поскольку возможно, установлена неправильная версия. Если у вас нет правильной версии Heaventools FlexHex (или любой из других программ, перечисленных выше), вам может потребоваться попробовать загрузить другую версию или одно из других программных приложений, перечисленных выше. Ваш файл электронной таблицы, вероятно, был создан более новой версией Heaventools FlexHex, чем то, что в данный момент установлен на вашем компьютере.

Совет . Исследуйте HEX-файл, щелкнув правой кнопкой мыши и выбрав «Свойства», чтобы найти подсказки о том, какая версия вам нужна.

В первую очередь проблемы, возникающие при открытии HEX-файлов, связаны с тем, что на вашем компьютере установлена неправильная версия Heaventools FlexHex.

Предполагая, что у вас установлена правильная версия Heaventools FlexHex, другие проблемы могут помешать вам открывать HEX-файлы. Другие ошибки открытия HEX могут быть созданы другими системными проблемами внутри %%os%%. Проблемы, не связанные с программным обеспечением:

HSL

Цветовая модель HSL является представлением модели RGB в цилиндрической системе координат. HSL представляет цвета более интуитивным и понятным для восприятия образом, чем типичное RGB. Модель часто используется в графических приложениях, в палитрах цветов, и для анализа изображений.

HSL расшифровывается как Hue (цвет/оттенок), Saturation (насыщенность), Lightness/Luminance (светлота/светлость/светимость, не путать с яркостью).

Hue задаёт положение цвета на цветовом круге (от 0 до 360). Saturation является процентным значением насыщенности (от 0% до 100%). Lightness является процентным значением светлости (от 0% до 100%).

  1. h1 { color: hsl(120, 100%, 50%); } /* зелёный */
  2. h2 { color: hsl(120, 100%, 75%); } /* светло-зелёный */
  3. h3 { color: hsl(120, 100%, 25%); } /* тёмно-зелёный */
  4. h4 { color: hsl(120, 60%, 70%); } /* пастельный зеленый */

HSL поддерживается в IE9+, Firefox, Chrome, Safari, и в Opera 10+.

Общие сведения о проблемах с HEX

Общие проблемы с открытием файлов HEX

Heaventools FlexHex нет

При попытке загрузить HEX-файл появляется сообщение, например «Не удается открыть HEX-файлы». Если это так, это обычно связано с тем, что у вас нет Heaventools FlexHex для %%os%%, установленного на вашем компьютере. Типичный путь открытия документа HEX двойным щелчком не будет работать, так как %%os%% не может установить подключение к программе.

Совет: Другая программа, связанная с HEX, может быть выбрана, чтобы открыть файл, нажав «Показать приложения» и найдя приложение.

Неверная версия Heaventools FlexHex

Файл Hexadecimal Source File несовместим с Heaventools FlexHex, поскольку возможно, установлена неправильная версия. Если у вас нет правильной версии Heaventools FlexHex (или любой из других программ, перечисленных выше), вам может потребоваться попробовать загрузить другую версию или одно из других программных приложений, перечисленных выше. Ваш файл электронной таблицы, вероятно, был создан более новой версией Heaventools FlexHex, чем то, что в данный момент установлен на вашем компьютере.

Совет . Исследуйте HEX-файл, щелкнув правой кнопкой мыши и выбрав «Свойства», чтобы найти подсказки о том, какая версия вам нужна.

В первую очередь проблемы, возникающие при открытии HEX-файлов, связаны с тем, что на вашем компьютере установлена неправильная версия Heaventools FlexHex.

Предполагая, что у вас установлена правильная версия Heaventools FlexHex, другие проблемы могут помешать вам открывать HEX-файлы. Другие ошибки открытия HEX могут быть созданы другими системными проблемами внутри %%os%%. Проблемы, не связанные с программным обеспечением:

Подробности

Скриншот обычного шестнадцатеричного редактора (шестнадцатеричный редактор Паскаля Риго (Pixel))

С помощью шестнадцатеричного редактора пользователь может видеть или редактировать необработанное и точное содержимое файла, в отличие от интерпретации того же содержимого, которое другое прикладное программное обеспечение более высокого уровня может связать с форматом файла . Например, это могут быть необработанные данные изображения, в отличие от того, как программное обеспечение для редактирования изображений интерпретирует и отображает тот же файл.

Шестнадцатеричные редакторы могут использоваться для исправления данных, поврежденных системными или прикладными программными проблемами, когда может быть нецелесообразно писать специальную программу для внесения исправлений. Они полезны для обхода проверок редактирования приложений, которые могут предотвратить исправление ошибочных данных. Они использовались для «исправления» исполняемых программ с целью изменения или добавления нескольких инструкций в качестве альтернативы перекомпиляции. Исправления программ для систем мэйнфреймов IBM иногда распространяются как исправления, а не как полная копия уязвимой программы.

В большинстве приложений шестнадцатеричного редактора данные компьютерного файла представлены в виде шестнадцатеричных значений, сгруппированных в 4 группы по 4 байта (или две группы по 8 байтов), за которыми следует одна группа из 16 печатаемых символов ASCII, которые соответствуют каждой паре шестнадцатеричных значений. (каждый байт). Непечатаемые символы ASCII (например, Bell) и символы, которые занимают более одного символьного пробела (например, табуляция), обычно представлены точкой («.») В следующем поле ASCII.

Ограничения по размеру

В отличие от обычных текстовых редакторов, шестнадцатеричные редакторы могут эффективно обрабатывать файлы неопределенного размера, поскольку при просмотре и изменении при сохранении загружается только часть файла, а не весь файл сразу.

HexCmp

У этой программы есть сразу две важные особенности. Она использует шестнадцатеричную систему и способна сравнивать двоичные файлы. Имеет расширенные функции, такие как цветовое выделение и синхронная прокрутка, а также обладает панелью, содержащей информацию о записях в различных форматах.


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

Вычисления

Квантование

Вы помните, что матрица проходит этап квантования? Элементы матрицы нужно почленно перемножить с элементами матрицы квантования. Осталось выбрать нужную. Сначала мы просканировали первый канал. Он использует матрицу квантования 0 (у нас она первая из двух). Итак, после перемножения получаем 4 матрицы Y-канала:

… и по матрице для Cb и Cr.

Обратное дискретно-косинусное преобразование

Формула не должна доставить сложностей. Svu — наша полученная матрица коэффициентов. u — столбец, v — строка. Cx = 1/√2 для x = 0, а в остальных случаях = 1. syx — непосредственно значения каналов.

Приведу результат вычисления только первой матрицы канала Y (после обязательного округления):

и для Cb Cr:

Ко всем полученным значениям нужно прибавить по 128, а затем ограничить их диапазон от 0 до 255:

Например: 138 → 266 → 255, 92 → 220 → 220 и т. д.

YCbCr в RGB

4 матрицы Y, и по одной Cb и Cr, так как мы прореживали каналы и 4 пикселям Y соответствует по одному Cb и Cr. Поэтому вычислять так: YCbCrToRGB(Y, Cb[y/2, x/2], Cr[y/2, x/2]):

Вот полученные таблицы для каналов R, G, B для левого верхнего квадрата 8×8 нашего примера:

Три системы счисления.

Практическое программирование на ассемблере требует понимания системы счисления. Систем счисления существует бесконечное множество. Наиболее знакомая для нас — десятичная система счисления. Римская нумерация циферблата часов демонстрирует нам двенадцатеричную систему счисления. Программистам на ассемблере необходимо освоить три системы счисления : десятичную, двоичную и шестнадцатеричную.

Машина «думает» байтами. Байт состоит из 8 бит. Бит может содержать одно значение: 0 или 1. Так что в принципе, неплохо иметь представление и о восьмеричной системе счисления.Однако машинный код отображается в различных редакторах в виде шестнадцатеричного значения — оно более удобно для восприятия, так что всё же остановимся на трёх обязательно необходимых программисту системах счисления.

Шестнадцатеричная система счисления.

В шестнадцатеричной системе счисления одним символом отображаются числа от нуля до шестнадцати. Чтобы не сочинять новых отображений цифр,
решили использовать буквы латинского  алфавита: A, B, C, D, E, F.

Для большей понятности  — внизу приведена таблица соответствия цифр трём системам счисления.

DEC BIN HEX
Десятичная Двоичная Шестнадцатиричная
0 0 0
1 1 1
2 10 2
3 11 3
4 100 4
5 101 5
6 110 6
7 111 7
8 1000 8
9 1001 9
10 1010 A
11 1011 B
12 1100 C
13 1101 D
14 1110 E
15 1111 F
16 10000 10
17 10001 11
18 10010 12
….

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22

DECBINHEX

ДесятичнаяДвоичнаяШестнадцатиричная

111

2102

3113

41004

51015

61106

71117

810008

910019

101010A

111011B

121100C

131101D

141110E

151111F

161000010

171000111

181001012

….

Запоминать соответствия цифр нет необходимости. В состав Windows любой версии входит программа «калькулятор» — calc.exe. Запустите её, переключитесь в программистский вид (Вид->Программист или Alt+3) и да пребудет с вами сила!

Калькулятор программиста: HEX, DEC, OCT, BIN.

Чтение файла

Файл поделен на секторы, предваряемые маркерами. Маркеры имеют длину 2 байта, причем первый байт . Почти все секторы хранят свою длину в следующих 2 байта после маркера. Для удобства подсветим маркеры:

Маркер : DQT — таблица квантования

  • Длина: 0x43 = 67 байт
  • Длина значений в таблице: 0 (0 — 1 байт, 1 — 2 байта)
  • Идентификатор таблицы: 0

Оставшимися 64-мя байтами нужно заполнить таблицу 8×8.

Приглядитесь, в каком порядке заполнены значения таблицы. Этот порядок называется zigzag order:

Маркер : SOF0 — Baseline DCT

Этот маркер называется SOF0, и означает, что изображение закодировано базовым методом. Он очень распространен. Но в интернете не менее популярен знакомый вам progressive-метод, когда сначала загружается изображение с низким разрешением, а потом и нормальная картинка. Это позволяет понять что там изображено, не дожидаясь полной загрузки. Спецификация определяет еще несколько, как мне кажется, не очень распространенных методов.

  • Длина: 17 байт.
  • Precision: 8 бит. В базовом методе всегда 8. Это разрядность значений каналов.
  • Высота рисунка: 0x10 = 16
  • Ширина рисунка: 0x10 = 16
  • Количество каналов: 3. Чаще всего это Y, Cb, Cr или R, G, B

1-й канал:

  • Идентификатор: 1
  • Горизонтальное прореживание (H1): 2
  • Вертикальное прореживание (V1): 2
  • Идентификатор таблицы квантования: 0

2-й канал:

  • Идентификатор: 2
  • Горизонтальное прореживание (H2): 1
  • Вертикальное прореживание (V2): 1
  • Идентификатор таблицы квантования: 1

3-й канал:

  • Идентификатор: 3
  • Горизонтальное прореживание (H3): 1
  • Вертикальное прореживание (V3): 1
  • Идентификатор таблицы квантования: 1

Находим Hmax=2 и Vmax=2. Канал i будет прорежен в Hmax/Hi раз по горизонтали и Vmax/Vi раз по вертикали.

Маркер : DHT (таблица Хаффмана)

Эта секция хранит коды и значения, полученные кодированием Хаффмана.

  • Длина: 21 байт
  • Класс: 0 (0 — таблица DC коэффициентов, 1 — таблица AC коэффициентов).
  • Идентификатор таблицы: 0

Следующие 16 значений:

Количество кодов означает количество кодов такой длины

Обратите внимание, что секция хранит только длины кодов, а не сами коды. Мы должны найти коды сами

Итак, у нас есть один код длины 1 и один — длины 2. Итого 2 кода, больше кодов в этой таблице нет.
С каждым кодом сопоставлено значение, в файле они перечислены следом. Значения однобайтовые, поэтому читаем 2 байта:

  • — значение 1-го кода
  • — значение 2-го кода

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

Построение дерева кодов Хаффмана

Мы должны построить бинарное дерево по таблице, которую мы получили в секции DHT. А уже по этому дереву мы узнаем каждый код. Значения добавляем в том порядке, в каком указаны в таблице. Алгоритм прост: в каком бы узле мы ни находились, всегда пытаемся добавить значение в левую ветвь. А если она занята, то в правую. А если и там нет места, то возвращаемся на уровень выше, и пробуем оттуда. Остановиться нужно на уровне равном длине кода. Левым ветвям соответствует значение 0, правым — 1.

Деревья для всех таблиц этого примера:

В кружках — значения кодов, под кружками — сами коды (поясню, что мы получили их, пройдя путь от вершины до каждого узла). Именно такими кодами закодировано само содержимое рисунка.

Маркер : SOS (Start of Scan)

Байт в маркере означает — «ДА! Наконец-то то мы перешли к финальной секции!». Однако секция символично называется SOS.

  • Длина: 12 байт.
  • Количество каналов. У нас 3, по одному на Y, Cb, Cr.

1-й канал:

  • Идентификатор канала: 1 (Y)
  • Идентификатор таблицы Хаффмана для DC коэффициентов: 0
  • Идентификатор таблицы Хаффмана для AC коэффициентов: 0

2-й канал:

  • Идентификатор канала: 2 (Cb)
  • Идентификатор таблицы Хаффмана для DC коэффициентов: 1
  • Идентификатор таблицы Хаффмана для AC коэффициентов: 1

3-й канал:

  • Идентификатор канала: 3 (Cr)
  • Идентификатор таблицы Хаффмана для DC коэффициентов: 1
  • Идентификатор таблицы Хаффмана для AC коэффициентов: 1

, , — Start of spectral or predictor selection, End of spectral selection, Successive approximation bit position. Эти значения используются только для прогрессивного режима, что выходит за рамки статьи.

Отсюда и до конца (маркера ) закодированные данные.

Резюме файла HEX

Согласно нашим записям, существуют два тип(ы) файлов, связанных с расширением HEX, самый популярный из которых отформатирован в качестве Hexadecimal Source File. Самое распространенное связанное приложение — Heaventools FlexHex, выпущенное Heaventools Software. Кроме того, два различные программы позволяют вам просматривать эти файлы.
Эти файлы классифицируют на Developer Files или Encoded Files. Основная часть файлов относится к Developer Files.

Файлы с расширением HEX были идентифицированы на настольных компьютерах (и некоторых мобильных устройствах). Они полностью или частично поддерживаются Windows, Mac и iOS.

Рейтинг популярности файлов HEX составляет «Низкий», что означает, что данные файлы встречаются редко.

Выводы

Упомянутые выше HEX редакторы Linux, достаточно часто используются владельцами компьютеров, работающих под этой операционной системой. Некоторые из них более популярны среди специалистов — программистов и разработчиков. Другие приходятся по вкусу тем, кто пользуется подобным ПО лишь от случая к случаю. Тем не менее, можно сказать, что все они достаточно гибкие и функциональные для того, чтобы удовлетворить потребности всех пользователей.

Нет похожих записей

Статья распространяется под лицензией Creative Commons ShareAlike 4.0 при копировании материала ссылка на источник обязательна.

Добавить комментарий

Ваш адрес email не будет опубликован. Обязательные поля помечены *

Adblock
detector