Подробный гайд по проверке параметров кодирования .fig

Подробный гайд по проверке параметров кодирования .fig: структура ZIP, canvas.fig, формат Kiwi, сжатие deflateRaw и Zstd, версии, библиотеки для анализа.

2026.09.25                  


Подробный гайд по проверке параметров кодирования .figПодробный гайд по проверке параметров кодирования .fig Файлы .fig — это нативный формат Figma, который представляет собой не текстовый, а сложный бинарный контейнер. Проверка его параметров кодирования требует понимания внутренней структуры. Ниже приведено подробное руководство.


Что такое .fig и его внутренняя структура

Файл .fig — это стандартный ZIP-архив (в режиме без сжатия / store mode), который содержит следующие компоненты:

Компонент Обязателен Описание
canvas.fig Да Бинарный документ Figma (закодирован в Kiwi)
thumbnail.png Да Миниатюра для файлового браузера Figma (без неё Figma отклоняет файл)
meta.json Да Метаданные: имя файла, цвет фона, координаты рендеринга
images/ Нет Изображения, названные по SHA-1 хешу



Основной интерес представляет canvas.fig, внутри которого находится бинарный формат Kiwi, созданный соучредителем Figma Эваном Уоллесом. Kiwi похож на Protocol Buffers, но оптимизирован для JavaScript и имеет более компактное кодирование.


Бинарная структура canvas.fig

Файл canvas.fig имеет чёткую бинарную разметку.

Вот его структура:

Смещение Размер Содержимое
0 8 байт Прелюдия (ASCII): fig-kiwi, fig-deck или fig-jam.
8 4 байта Версия (uint32 little-endian). Известные значения: 101, 106
12 4 байта Длина N чанка схемы (uint32 LE)
16 N байт Сжатая схема Kiwi (deflateRaw)
... 4 байта Длина M чанка данных (uint32 LE)
... M байт Сжатые данные Kiwi (Zstandard / Zstd)

Ключевые параметры кодирования:

  • Схема (чанк 0): сжата алгоритмом deflateRaw (RFC 1951, без обёрток zlib/gzip).
  • Данные (чанк 1): сжаты алгоритмом Zstandard (Zstd). При чтении следует проверять магические байты Zstd (0x28 0xB5 0x2F 0xFD), чтобы отличить от старых файлов с deflateRaw.
  • Схема Kiwi: определяет 194 типа сообщений, центральный тип — NodeChange (около 390 полей).

Пошаговое руководство по проверке

Шаг 1: Проверка ZIP-оболочки

Убедитесь, что файл является ZIP-архивом.

Это можно сделать стандартными средствами:

  • Linux/macOS: unzip -l file.fig
  • Windows: откройте файл архиватором (7-Zip, WinRAR) или используйте PowerShell: Expand-Archive -Path file.fig -DestinationPath output

Внутри вы должны увидеть как минимум canvas.fig, thumbnail.png и meta.json.


Шаг 2: Извлечение canvas.fig

Если ZIP-структура подтверждена, извлеките canvas.fig для дальнейшего анализа.


Шаг 3: Проверка заголовка и версии

Используйте hex-редактор (например, xxd, HxD, hexdump) или скрипт для чтения первых 16 байт canvas.fig:

  • Байты 0–7: должны содержать один из прелюдов: fig-kiwi, fig-deck или fig-jam..
  • Байты 8–11: значение версии (uint32 LE). Известные версии: 101, 106. Figma принимает версию 105, но отклоняет 109.

Пример на Python:

import struct
with open('canvas.fig', 'rb') as f:
    data = f.read(16)
    prelude = data[:8].decode('ascii', errors='ignore')
    version = struct.unpack('<I', data[8:12])[0]
    print(f"Prelude: {prelude}, Version: {version}")

Шаг 4: Проверка сжатия чанков

Прочитайте длину первого чанка (смещение 12, uint32 LE), затем пропустите его и прочитайте длину второго чанка. Проверьте магические байты Zstd во втором чанке.

Пример на Python:

import struct
with open('canvas.fig', 'rb') as f:
    f.seek(12)
    schema_len = struct.unpack('<I', f.read(4))[0]
    f.seek(12 + 4 + schema_len)
    msg_len = struct.unpack('<I', f.read(4))[0]
    msg_data = f.read(4)
    is_zstd = msg_data == b'\x28\xb5\x2f\xfd'
    print(f"Schema chunk length: {schema_len}, Message chunk length: {msg_len}, Zstd compressed: {is_zstd}")

Шаг 5: Декодирование схемы и данных Kiwi

Для полноценного декодирования потребуются специализированные библиотеки:

  • fig-kiwi (npm) — пакет для чтения/записи .fig файлов с TypeScript-определениями, производными от схемы Kiwi.
  • kiwi-schema — декодер бинарного формата Kiwi.
  • pako — для распаковки deflate-сжатой схемы.
  • fzstd — для распаковки Zstd-сжатых данных.

Пример использования CLI из fig-kiwi:



node cli --schema figma.kiwi --root-type NodeChanges --to-json simple.fig

Эта команда распакует simple.fig и выведет JSON-представление данных.


Сводная таблица параметров кодирования

Параметр Значение / Алгоритм Где проверять
Формат контейнера ZIP (store mode) Структура архива
Прелюдия fig-kiwi (8 байт) Смещение 0 в canvas.fig
Версия uint32 LE (например, 101, 106) Смещение 8
Сжатие схемы deflateRaw Чанк 0
Сжатие данных Zstandard (Zstd) Чанк 1, магические байты 0x28 0xB5 0x2F 0xFD
Формат сериализации Kiwi (бинарный) Внутри чанков после распаковки
Корневой тип NodeChange[] В схеме Kiwi

Важное замечание о формате Xfig

Существует также формат .fig от программы Xfig — это совершенно другой, текстовый формат для векторной графики. Файлы Xfig обычно кодируются в UTF-8. Если ваш файл открывается как текст и содержит команды вроде #FIG 3.2, то это Xfig, а не Figma. Для проверки кодировки Xfig достаточно открыть файл в текстовом редакторе и посмотреть, отображаются ли символы корректно.


Важно

Проверка параметров кодирования .fig (Figma) сводится к анализу ZIP-архива, извлечению canvas.fig и проверке его бинарных заголовков и чанков. Ключевые моменты — это подтверждение прелюдии fig-kiwi, чтение версии и определение алгоритмов сжатия (deflateRaw для схемы, Zstd для данных). Для глубокого анализа используйте специализированные библиотеки fig-kiwi и kiwi-schema.


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


Статью подготовил: Аверко Денис Сергеевич @Nymexis г. Омск (специалист по ЗИ)

Комментарии

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