C40-режим кодирования
C40-режим кодирования — это один из методов кодирования данных, используемый в двумерных штриховых кодах (в частности, в стандарте Data Matrix и Aztec Code) для компактного представления алфавитно-цифровой информации. В отличие от базовых режимов (ASCII, цифрового), C40 позволяет эффективно кодировать символы латинского алфавита, цифры и ряд специальных знаков, используя для этого комбинации из шести бит на символ вместо восьми, что обеспечивает экономию пространства в кодовом слове.
История и контекст появления
C40-режим был разработан в рамках стандарта ANSI/AIM BC11-1997 (позже вошедшего в ISO/IEC 16022:2000 для Data Matrix) как решение проблемы неэффективного кодирования текстовой информации. В ранних версиях двумерных кодов (например, PDF417) использовалось прямое 8-битное представление символов, что приводило к избыточности при работе с английским текстом. C40 стал частью семейства так называемых «текстовых режимов» (Text Compaction Modes), куда также входят режимы X12, EDIFACT и Base 256. Его название происходит от кодовой таблицы, содержащей 40 символов (C — «Character», 40 — количество базовых кодовых точек).
Принцип работы
C40-режим работает на основе кодирования последовательностей символов в 6-битные значения. В отличие от ASCII-режима, где каждый символ занимает 8 бит (один байт), в C40 три символа упаковываются в два байта (16 бит), что даёт среднюю плотность 5,33 бита на символ. Это достигается за счёт использования специальной таблицы кодирования, где каждому символу ставится в соответствие число от 0 до 39.
Таблица кодирования C40
| Значение | Символ | Примечание |
|---|---|---|
| 0–9 | 0–9 | Цифры |
| 10–35 | A–Z | Прописные латинские буквы |
| 36 | Пробел | |
| 37 | Сдвиг 1 | Переход в подрежим специальных символов |
| 38 | Сдвиг 2 | Переход в подрежим строчных букв |
| 39 | Сдвиг 3 | Переход в подрежим управляющих символов |
Процесс кодирования
- Выбор режима: Декодер определяет, что текущая последовательность символов может быть закодирована в C40. Обычно это происходит, если строка состоит преимущественно из заглавных букв, цифр и пробелов.
- Преобразование символов: Каждый символ заменяется его числовым значением из таблицы C40 (0–39).
- Упаковка в кодовые слова: Три последовательных значения (v1, v2, v3) объединяются в одно 16-битное кодовое слово по формуле:
кодовое_слово = (v1 1600) + (v2 40) + v3 где 1600 = 40². Полученное число занимает два байта.
- Обработка неполных групп: Если количество символов не кратно трём, остаток кодируется специальным образом. Для одного символа используется 11-битное кодовое слово, для двух — 16-битное, но с меньшей плотностью.
Подрежимы (сдвиги)
Для кодирования символов, отсутствующих в основной таблице (строчные буквы, знаки препинания, управляющие коды), используются три подрежима, активируемые значениями 37–39:
- Сдвиг 1 (значение 37): Следующий за ним символ интерпретируется по дополнительной таблице (например,
!,",#,$,%,&,',(,),*,+,,,-,.,/,:). - Сдвиг 2 (значение 38): Активирует подрежим строчных букв (a–z). После одного символа из этого подрежима автоматически происходит возврат к основному.
- Сдвиг 3 (значение 39): Позволяет кодировать управляющие символы (ASCII 0–31) или дополнительные знаки (например,
[,\,],^,_, ```).
Каждый сдвиг увеличивает общее количество бит на символ, так как занимает место в группе из трёх значений, но всё равно остаётся более эффективным, чем прямой 8-битный режим для коротких вставок.
Применение в стандартах
Data Matrix
В стандарте Data Matrix (ISO/IEC 16022:2006) C40-режим используется как один из трёх основных текстовых режимов сжатия (наряду с Text и X12). Он применяется для кодирования данных в так называемых «квадратных» и «прямоугольных» символах. Вход в режим осуществляется с помощью управляющего кодового слова 230 (0xE6), а выход — с помощью 231 (0xE7) или автоматически при завершении последовательности.
Aztec Code
В стандарте Aztec Code (ISO/IEC 24778:2008) C40-режим является одним из вариантов компактного кодирования текста. Он используется в комбинации с другими режимами (Binary, Byte, Digit) и активируется через заголовочные кодовые слова в сообщении. В Aztec Code C40 часто применяется для кодирования адресов URL, имён и коротких сообщений.
Другие системы
Некоторые проприетарные системы штрихового кодирования (например, MaxiCode, QR Code) используют аналогичные схемы сжатия, но с другими таблицами. В QR Code (ISO/IEC 18004:2015) существует режим «Alphanumeric», который кодирует 45 символов (цифры, заглавные буквы, пробел и 9 специальных знаков) с плотностью 5,5 бит на символ — принципиально близкий к C40, но с меньшим набором символов.
Преимущества и ограничения
Преимущества
- Эффективность: Средняя плотность кодирования — около 5,33 бит на символ, что на 33% компактнее 8-битного ASCII-режима.
- Простота реализации: Алгоритм упаковки основан на простых арифметических операциях (умножение и сложение), что делает его быстрым для встраиваемых систем.
- Совместимость: Поддерживается всеми основными декодерами Data Matrix и Aztec Code.
Ограничения
- Ограниченный набор символов: Основная таблица содержит только 40 символов (цифры, заглавные буквы, пробел). Для кодирования строчных букв или большинства знаков препинания требуются сдвиги, что снижает эффективность.
- Неэффективность для коротких строк: Для строк длиной менее 3 символов плотность кодирования падает, так как приходится использовать неполные группы.
- Зависимость от контекста: Если данные содержат много символов, требующих сдвигов (например, смесь прописных и строчных букв), общая эффективность может быть ниже, чем в режиме ASCII.
Сравнение с другими режимами
| Режим | Бит на символ | Набор символов | Применение |
|---|---|---|---|
| ASCII | 8 | Все ASCII (0–127) | Универсальный |
| C40 | 5,33 | 40 основных + подрежимы | Английский текст, URL |
| X12 | 5,33 | 40 символов (EDIFACT) | Электронный обмен данными |
| Base 256 | 8 | Любые байты | Бинарные данные |
C40-режим занимает промежуточное положение: он эффективнее ASCII для типичного английского текста, но менее универсален, чем Base 256 для произвольных данных.
Интересные факты
- В стандарте Data Matrix C40-режим иногда называют «C40 Text Compaction» или просто «Text mode» (в отличие от «ASCII mode»).
- При кодировании длинных строк в C40 декодер должен отслеживать состояние сдвигов, что может усложнять аппаратную реализацию.
- В некоторых реализациях (например, в библиотеках ZXing и libdmtx) C40-режим автоматически выбирается алгоритмом оптимизации, который анализирует содержимое данных перед кодированием.
- C40-режим не поддерживает кодирование кириллицы или других национальных алфавитов — для этого требуется использование расширенных режимов (например, Base 256 с кодировкой UTF-8).
Источники
- ISO/IEC 16022:2006 — Information technology — Automatic identification and data capture techniques — Data Matrix bar code symbology specification.
- ISO/IEC 24778:2008 — Information technology — Automatic identification and data capture techniques — Aztec Code bar code symbology specification.
- ANSI/AIM BC11-1997 — Uniform Symbology Specification — Data Matrix.
- Документация библиотеки libdmtx (версия 0.7.7) — описание режимов кодирования.
- Статья «Data Matrix Encoding and Decoding» в журнале «Journal of Electronic Imaging» (2012), том 21, выпуск 3.
BFOmetr — база данных и аналитика по компаниям России.
На главную BFOmetr →