Как можно улучшить степень сжатия при использовании формата gif?
Просмотрите палитру вашего рисунка с помощью графического редактора - например, с помощью Corel Photo Paint. Вы можете обнаружить в ней очень близкие цвета. Если заменить пикселы одного из этих цветов на пикселы другого цвета, то вы можете получить заметное уменьшение файла, правда, за счет некоторой потери цветовой глубины.
В GIF-анимациях для каждой картинки может быть сформирована отдельная палитра. Если ее нет, данная картинка будет выводиться в глобальной палитре - той самой, что расположена в начале файла. Поэтому вы можете существенно уменьшить размер выходного файла, если все изображения в анимации будут иметь общую палитру - ведь каждая палитра имеет размер 256*3=768 байт.
Еще одна хитрая особенность GIF заключается в том, что в анимационных кадрах можно хранить изображение не полного размера, а лишь тот участок, который меняется по сравнению с предыдущим кадром. Допустим, вы хотите изобразить самолетик, пролетающий над домом. Для реализации такой анимации вам достаточно в каждом последующем кадре изображать только самолетик, сдвинутый относительно предыдущего кадра, с указанием его координат.
Естественно, самолетик из второго кадра должен полностью перекрывать аналогичный объект из первого кадра. Такой подход позволяет уменьшить размер файла в несколько раз!
Изготовить анимацию для Internet можно еще одним способом. Нужно подготовить все изображения в формате JPEG и изготовить Java-скрипт, выводящий их в определенной последовательности. При более изощренном владении Явой можно реализовать и описанный выше "кусочный" подход. С учетом того, что JPEG дает несравненно большее сжатие, чем GIF, такая технология может оказаться очень эффективной. А если представить себе все спецэффекты, которые можно реализовать с помощью Java... Но мы несколько отклонились от темы. Итак, раз уж речь зашла о JPEG, обсудим подробнее этот замечательный графический формат.
JPEG
Алгоритм JPEG был разработан группой фирм под названием Joint Photographic Experts Group. Целью проекта являлось создание высокоэффективного стандарта сжатия как черно-белых, так и цветных изображений, эта цель и была достигнута разработчиками. В настоящее время JPEG находит широчайшее применение там, где требуется высокая степень сжатия - например, в Internet.
В отличие от LZW-алгоритма JPEG-кодирование является кодированием с потерями. Сам алгоритм кодирования базируется на очень сложной математике, но в общих чертах его можно описать так: изображение разбивается на квадраты 8*8 пикселов, а затем каждый квадрат преобразуется в последовательную цепочку из 64 пикселов. Далее каждая такая цепочка подвергается так называемому DCT-преобразованию, являющемуся одной из разновидностей дискретного преобразования Фурье. Функцию преобразования в силу ее сложности для большинства наших читателей приводить здесь не будем, однако суть преобразования на словах поясним. Она заключается в том, что входную последовательность пикселов можно представить в виде суммы синусоидальных и косинусоидальных составляющих с кратными частотами (так называемых гармоник). В этом случае нам необходимо знать лишь амплитуды этих составляющих для того, чтобы восстановить входную последовательность с достаточной степенью точности. Чем большее количество гармонических составляющих нам известно, тем меньше будет расхождение между оригиналом и сжатым изображением. Большинство JPEG-кодеров позволяют регулировать степень сжатия. Достигается это очень простым путем: чем выше степень сжатия установлена, тем меньшим количеством гармоник будет представлен каждый 64-пиксельный блок.
Говоря техническим языком, JPEG-кодер представляет собой цифровой фильтр низких частот, причем чем выше степень сжатия, тем ниже частота среза этого фильтра. Визуально это проявляется в "сглаживании" изображения, потере контрастности, появлении "краевых эффектов" в виде "теней" возле резких границ. Поэтому степень сжатия и качество результата сильно зависят от характера изображения: если рисунок содержит много "штриховых" элементов, то он будет сжат хуже, чем "гладкое" изображение.
С целью анализа качества результатов были проведены следующие действия: *.jpg - файлы были преобразованы в BMP- формат, а затем была вычислена "разность" исходного изображения и картинки, прошедшей JPEG - кодирование.
Очевидно, что вторая картинка искажена гораздо сильнее первой. Оно и понятно - резкие, контрастные переходы содержат высокочастотные гармонические составляющие, которые JPEG просто "вырезает" при Фурье-преобразовании. Разностные картинки - это, конечно, хорошо, но хотелось бы иметь количественный критерий качества JPEG-преобразования.
Давайте попробуем сформулировать такой критерий. Как известно, каждый True-color пиксел может быть представлен тремя цветовыми составляющими: R, G и B, то есть каждый пиксел представляет собой вектор в трехмерном цветовом пространстве. Таким, образом, разницу между двумя пикселами можно найти как расстояние между двумя векторами в пространстве. Обозначим это расстояние как L. Тогда:
А разницу между двумя картинками можно найти как математическое ожидание расстояния между их соответствующими пикселами, то есть, говоря проще, как среднее арифметическое этих расстояний.
Конечно, можно предложить другой метод оценки качества кодирования, но и этот дает вполне наглядные результаты. Так, для рассмотренного выше примера Delta = 1.35 для "градиентной" картинки и 8.883 для "цветных прямоугольников" (естественно, чем больше Delta, тем хуже качество).
Однако приведенные выше примеры достаточно искусственны. Возьмем в качестве тестового примера фотографию реальных объектов. Исходный true-color файл имел размер 363 Кб. Попробуем сжимать эту картинку JPEG-кодером с различными коэффициентами сжатия. Сжатие производилось с помощью Corel Photo Paint.
Ниже по тексту под "степенью сжатия" понимается положение движка "Compression". Движок "Smoothing" во всех экспериментах находился в нулевом положении. В других программах коэффициент сжатия может быть выражен в других единицах и настройки могут быть победнее.
Итак, станем сжимать наш тестовый файл с различными коэффициентами и вычислять для каждого полученного результата нашу любимую величину Delta. Результат вполне закономерен: чем больше степень сжатия, тем больше вносимые искажения. При коэффициенте сжатия, равном 100, исходная картинка искажена очень сильно и, по сути, представляет собой набор блоков 8*8 с градиентной заливкой каждого из них.
Хорошо, а если мы возьмем файл со степенью сжатия, к примеру, 10, декодируем его в BMP формат и снова преобразуем его в JPEG с тем же коэффициентом сжатия? Останется ли картинка в том же качестве или будет дополнительно искажена кодером? Ответ на этот вопрос достаточно важен.
Каждый раз при открытии в графическом редакторе JPEG-файл преобразуется в некий внутренний формат редактора, в котором и происходят все операции с контентом файла. Когда вы сохраняете файл, он снова преобразуется из внутреннего представления редактора в JPEG-формат. Не лучше ли перед редактированием JPEG перевести его в какой-либо формат без потерь (например, в TIFF)? Пусть он занимает больше места на диске, зато за его содержимое можно будет не беспокоиться.
Чтобы прояснить этот вопрос, выполним ряд преобразований исходной картинки в JPEG и обратно (в BMP). При каждом преобразовании качество картинки немного падает (Delta растет). Самое первое преобразование дает наибольшее ухудшение качества, на фоне которого последующие искажения малозаметны. Для того чтобы сделать их более явными, найдем величины отклонений между самым первым JPEG-ом и картинкой после N преобразований BMP-JPEG.
Величины отклонений, непрерывно возрастая, асимптотически стремятся к какой-то определенной величине. Видно, что при каждом последующем преобразовании разница между текущей картинкой и предыдущей стремится к нулю с ростом количества преобразований BMP-JPEG, то есть картинка все более и более "сглаживается", приходит к "идеальному" для данного коэффициента виду.
Ну а если мы попытаемся "спасти" наше изображение, уменьшив его коэффициент сжатия? Качество картинки возрасти, конечно, не может - потери информации, увы, необратимы. Но, может быть, оно хотя бы не ухудшится?
Чтобы ответить на этот вопрос, выполним преобразование нашей многострадальной фотографии в JPEG с коэффициентом 50, после чего пересохраним ее с коэффициентом 10. Размер файла после первого преобразования составил 16 Кб, а после пересохранения с коэффициентом 10 - 30 Кб. При этом отклонение получившегося файла от предшествующего ему составило 1.98, то есть небольшое ухудшение качества все же наблюдается.
Итак, можем ли мы теперь ответить на вопрос, чем хорош и чем плох формат JPEG? Безусловно, его сильной стороной является большой коэффициент сжатия при сохранении исходной цветовой глубины. Именно это свойство обусловило его широкое применение в Internet, где уменьшение размера файлов имеет первостепенное значение, в мультимедийных энциклопедиях, где требуется хранение возможно большего количества графики в ограниченном объеме.
Отрицательным свойством этого формата является неустранимое никакими средствами, внутренне ему присущее ухудшение качества изображения. Именно этот печальный факт не позволяет применять его в полиграфии, где качество ставится во главу угла.
Однако формат JPEG не является пределом совершенства в стремлении уменьшить размер конечного файла. В последнее время ведутся интенсивные исследования в области так называемого вейвлет-преобразования (или всплеск-преобразования). Основанные на сложнейших математических принципах вейвлет-кодеры позволяют получить большее сжатие, чем JPEG, при меньших потерях информации. Несмотря на сложность математики вейвлет-преобразования, в программной реализации оно проще, чем JPEG. Хотя алгоритмы вейвлет-сжатия пока находятся в начальной стадии развития, им уготовано большое будущее.
Двоичный симметричный канал
Двоичный симметричный канал — это простейший канал связи, на вход которого подаются двоичные символы с предположением, что данные всегда будут передаваться корректно. Этот канал часто используется в теории кодирования, как один из самых простейших для анализа каналов связи.
Описание
ДСК - это двоичный канал, по которому можно передать один из двух символов. Передача не идеальна, поэтому принимающий в некоторых случаях получает другой символ.
ДСК часто употребляется теоретиками как простейший канал с шумом. В теории связи множество проблем сводится к ДСК.
Определение
Двоичным симметричным каналом с переходной вероятностью называют канал с двоичным входом, двоичным выходом и вероятностью ошибки p0. Канал характеризуется следующими условными вероятностями:
Первый аргумент условной вероятности соответствует случайному передаваемому символу, второй полученному значению.
Вероятность p0 называют переходной вероятностью или вероятностью ошибки одного символа.
Пропускная способность ДСК
Пропускная способность канала
вычисляется
формулой:
,где
-
функция, называемая двоичной энтропией.Информационный канал
Канал информационный — это совокупность устройств, объединенных линиями связи, предназначенных для передачи информации от источника информации (начального устройства канала) до ее приемника (конечного устройства канала).
Линии связи обеспечивают прохождение информационных сигналов между устройствами канала. Информация обычно передается при помощи электрического тока (по проводам), света (по оптоволокну), электромагнитных волн радиодиапазона (в пространстве) и, редко, звука (в плотной среде: атмосфере, воде и т.п.) и прочих.
Устройства канала — это, как правило, репитеры, просто передающие усиленным принятый сигнал (пример, радиорелейные линии). К устройствам канала иногда относят и кодеры/декодеры, но в только тех случаях, когда кодирование/декодирование происходит с высокой скоростью, не требующей ее специального учета, как замедляющего фактора; обычно же кодеры/декодеры относят к источникам или приемникам информации.
Технические характеристики канала определяются принципом действия входящих в него устройств, видом сигнала, свойствами и составом физической среды, в которой распространяются сигналы, свойствами применяемого кода.
Эффективность канала характеризуется скоростью и достоверностью передачи информации, надежностью работы устройств и задержкой сигнала во времени.
Задержка сигнала во времени — это интервал времени от отправки сигнала передатчиком до его приема приемником.
Математически канал задается множеством допустимых сообщений на входе, множеством допустимых сообщений на выходе и набором условных вероятностей P(y/x) получения сигнала y на выходе при входном сигнале x. Условные вероятности описывают статистические свойства "шумов" (или помех), искажающих сигнал в процессе передачи. В случае, когда P(y/x) = 1 при y = x и P(y/x) = 0 при y ¹ х, канал называется каналом без "шумов". В соответствии со структурой входных и выходных сигналов выделяют дискретные и непрерывные каналы. В дискретных каналах сигналы на входе и выходе представляют собой последовательность символов одного или двух (по одному для входа и выхода) алфавитов. В непрерывных каналах входной и выходной сигналы представляют собой функции от непрерывного параметра-времени. Бывают также смешанные или гибридные каналы, но тогда обычно рассматривают их дискретные и непрерывные компоненты раздельно. Далее рассматриваются только дискретные каналы.
Способность канала передавать информацию характеризуется числом — пропускной способностью или емкостью канала (обозначение -C).
Для
случая канала без шума формула расчета
емкости канала имеет вид
,
где N(T)
—
число всех возможных сигналов за время
Т.
Пример. Пусть алфавит канала без "шумов" состоит из двух символов — 0 и 1, длительность t секунд каждый. За время Т успеет пройти п = Т/t сигналов, всего возможны 2n различных сообщений длиной п.
В
этом случае
На рис. 8 приведена схема, на которой изображен процесс прохождения информации по каналу с описанными в примере характеристиками.
Здесь для кодирования используется уровень сигнала: низкий для 0 и высокий для 1. Недостатки этого способа проявляются в случаях, когда нужно передавать много сплошных нулей или единиц. Малейшее рассогласование синхронизации между приемником и передатчиком приводит тогда к неисправимым ошибкам. Кроме того, многие носители информации, в частности, магнитные, не могут поддерживать длительный постоянный уровень сигнала.
Для передачи информации используется обычно другой способ, когда для представления 0 и 1 используются две разные частоты, отличающиеся друг от друга ровно в два раза (см. рис. 9) — это так называемая частотная модуляция (ЧМ или FM).
Таким образом, при таком кодировании, если сигнал 1 имеет длительность t, то 0 — 2t.
Рассчитаем
емкость этого канала. Нужно рассчитать
N(T).
Пусть
п
= Т/t, тогда
получается, что нужно рассчитать
сколькими способами можно разбить
отрезок длины п
отрезками
длины 2 и 1. Получаем, что
,
где первое слагаемое — это количество
способов, которыми можно разбить отрезок
длины п
п отрезками
длины 1, второе слагаемое — это количество
способов, которыми можно разбить отрезок
длины п
(п — 2)
отрезками длины 1 и одним отрезком длины
2, третье слагаемое — это количество
способов, которыми можно разбить отрезок
длины п
(п — 4)
отрезками длины 1 и двумя отрезками
длины 2 и т.д. Таким образом, S1
=
1. Вследствие того, что
для
любых k
< m,
получается, что
т.е. Sn+1 = Sn + Sn-1 при п > 1. Если положить, что S0 = 1, то S0, S1,... — это последовательность 1, 1, 2, 3, 5, 8, 13, 21, 34,..., т.е. числа Фибоначчи. С XIX века для вычисления n-го члена последовательности Фибоначчи известна формула
Таким образом,
бод.
При использовании частотной модуляции на практике нули, как правило, кодируются в два раза плотнее. Это достигается тем, что учитываются не уровни сигнала, а смена уровня (полярности). Если частота v соответствует 1, то с частотой 2v производится проверка уровня сигнала. Если он меняется, то это сигнал 1, если нет, то — 0. На практике частота v — это частота синхронизации, т. е. частота импульса, который независимо от данных меняет полярность сигнала. 0 не генерирует импульса смены полярности, а 1 генерирует (см. рис. 10).
Для записи информации на первые магнитные диски и ленты использовался метод FM. На гибкие диски 5.25" и 3.5" информация записывается методом MFM (Modified FM) — модификацией метода FM, позволяющей в 2 раза повысить плотность записи. Это достигается тем, что частота синхронизации увеличивается вдвое. MFM можно использовать с теми же физическими каналами, что и FM, потому что импульсы синхронизации не передаются перед 1 и первым 0 в серии нулей (см. рис. 11).
Метод записи с групповым кодированием, RLL — Run Limited Length, не использует импульсы синхронизации, применяется, в частности, в жестких дисках "винчестер" и существует в нескольких разновидностях. Одна из них основана на замене тетрад байта на 5-битные группы. Эти группы подбираются таким образом, чтобы при передаче данных нули не встречались подряд более двух раз, что делает код самосинхронизирующимся. Например, тетрада 0000 заменяется группой бит 11001, тетрада 1000 — 11010, тетрада 0001 — 11011, тетрада 1111 — 01111 (см. рис. 12). Существуют разновидности RLL, в которых заменяются последовательности бит различной длины. Кодирование MFM или FM можно представить как частный случай RLL.
При необходимости передачи записанных с помощью некоторого кода сообщений по данному каналу приходиться преобразовывать эти сообщения в допустимые сигналы канала, т. е. производить надлежащее кодирование, а при приеме данных — декодирование. Кодирование целесообразно производить так, чтобы среднее время, затрачиваемое на передачу, было как можно меньше. Получается, что исходному входному алфавиту нужно однозначно сопоставить новый алфавит, обеспечивающий большую скорость передачи.
Следующий, основной факт теории передачи информации или основная теорема о кодировании при наличии помех позволяет при знании емкости канала и энтропии передатчика вычислить максимальную скорость передачи данных в канале.
Теорема Шеннона. Пусть источник характеризуется д.с.в. X. Рассматривается канал с шумом, т.е. для каждого передаваемого сообщения задана вероятность e его искажения в процессе передачи (вероятность ошибки). Тогда существует такая скорость передачи и, зависящая только от X, что "e > 0 $ и' < и сколь угодно близкая к и такая, что существует способ передавать значения X со скоростью и' и с вероятностью ошибки меньшей e, причем и = С/НХ. Упомянутый способ образует помехоустойчивый код.
Кроме того, Фэно доказана следующая обратная теорема о кодировании при наличии помех. Для и' > и можно найти такое положительное число e, что в случае передачи информации по линии связи со скоростью и' вероятность ошибки e передачи каждого символа сообщения при любом методе кодирования и декодирования будет не меньше e (e очевидно растет вслед за ростом и').
Помехозащитное кодирование
Простейший код для борьбы с шумом — это контроль четности, он, в частности, широко используется в модемах. Кодирование заключается в добавлении к каждому байту девятого бита таким образом, чтобы дополнить количество единиц в байте до заранее выбранного для кода четного (even) или нечетного (odd) значения. Используя этот код, можно лишь обнаруживать большинство ошибок.
Простейший код, исправляющий ошибки, — это тройное повторение каждого бита. Если с ошибкой произойдет передача одного бита из трех, то ошибка будет исправлена, но если случится двойная или тройная ошибка, то будут получены неправильные данные. Часто коды для исправления ошибок используют совместно с кодами для обнаружения ошибок. При тройном повторении для повышения надежности три бита располагают не подряд, а на фиксированном расстоянии друг от друга. Использование тройного повторения значительно снижает скорость передачи данных.
Двоичный
симметричный канал изображен
на рис. 13, где р
—
это вероятность безошибочной передачи
бита, а
q —
вероятность передачи бита с ошибкой.
Предполагается, что в таком канале
ошибки происходят независимо. Далее
рассматриваются только такие каналы.
Двоичный
симметричный канал реализует схему
Бернулли, поэтому вероятность передачи
п
бит
по двоичному симметричному каналу с k
ошибками
равна
Пример.
Вероятность передачи одного бита
информации с ошибкой равна
q
=
0.01 и нас интересует вероятность
безошибочной передачи 1000 бит (125 байт).
Искомую вероятность можно подсчитать
по формуле
,
т.е. она ничтожно мала.
Добиться минимальности вероятности ошибки при передаче данных можно используя специальные коды. Обычно используют систематические помехозащитные коды. Идея систематических кодов состоит в добавлении к символам исходных кодов, предназначенных для передачи в канале, нескольких контрольных символов по определенной схеме кодирования. Принятая такая удлиненная последовательность кодов декодируется по схеме декодирования в первоначально переданную. Приемник способен распознавать и / или исправлять ошибки, вызванные шумом, анализируя дополнительную информацию, содержащуюся в удлиненных кодах.
Двоичным
(m,n)-кодом называется
пара, состоящая из схемы кодирования
Е:
и
схемы декодирования D:
—
множество всех двоичных последовательностей
длины n,
m
< n (случай
т
= n рассматривается
в криптографии).
Функции
D
и
E
выбираются
так, чтобы функция
где
Т
—
функция
ошибок, с
вероятностью, близкой к единице, была
тождественной. Функции D
и E
считаются
безошибочными, т. е. функция D
◦ E — тождественная (см. рис. 14).
Матричное кодирование
При явном задании схемы кодирования в (m, n)-коде следует указать 2m кодовых слов, что весьма неэффективно.
Одним из экономных способов описания схемы кодирования является методика матричного кодирования.
Пусть
- матрица m´n
с элементами gij, равными 0 или 1. Символ
+ обозначает сложение по модулю 2. Тогда
схема кодирования задается системой
уравнений
или в матричной форме b = aG, где a = a1a2...am - вектор, соответствующий передаваемому сообщению; b = b1b2...bn - вектор, соответствующий кодированному сообщению; G - порождающая матрица кода.
Порождающая матрица кода определена неоднозначно. Код не должен приписывать различным словам-сообщениям одно и то же кодовое слово. Можно доказать, что этого не произойдет, если первые m столбцов матрицы G образуют единичную матрицу.
Вместо 2m кодовых слов достаточно знать m слов, являющихся строками матрицы G.
Групповые коды
Линейным называется код, в котором проверочные символы представляют собой линейные комбинации информационных. Групповым называется код, который образует алгебраическую группу по отношению операции сложения по модулю два.
Свойство линейного кода: сумма (разность) кодовых векторов линей-ного кода дает вектор, принадлежащий этому коду. Свойство группового кода: минимальное кодовое расстояние между кодовыми векторами равно минимальному весу ненулевых векторов. Вес кодового вектора равен числу единиц в кодовой комбинации.
Групповые коды удобно задавать при помощи матриц, размерность которых определяется параметрами k и n. Число строк равно k, а число столбцов равно n = k+m.
.
(6)
Коды, порождаемые этими матрицами, называются (n, k)-кодами, а соответствующие им матрицы порождающими (образующими, производящими). Порождающая матрица G состоит из информационной Ikk и проверочной Rkm матриц. Она является сжатым описанием линейного кода и может быть представлена в канонической (типовой) форме
.
(7)
В качестве информационной матрицы удобно использовать единичную матрицу, ранг которой определяется количеством информационных разрядов
.
(8)
Строки единичной матрицы представляют собой линейно-незави-симые комбинации (базисные вектора), т. е. их по парное суммирование по модулю два не приводит к нулевой строке.
Строки порождающей матрицы представляют собой первые k комбинаций корректирующего кода, а остальные кодовые комбинации могут быть получены в результате суммирования по модулю два всевозможных сочетаний этих строк.
Столбцы добавочной матрицы Rkm определяют правила формирования проверок. Число единиц в каждой строке добавочной матрицы должно удовлетворять условию r1 ³ d0-1, но число единиц определяет число сумматоров по модулю 2 в шифраторе и дешифраторе, и чем их больше, тем сложнее аппаратура.
Производящая матрица кода G(7,4) может иметь вид
и
т.д.
Процесс кодирования состоит во взаимно - однозначном соответствии k-разрядных информационных слов - I и n-разрядных кодовых слов - с
c=IG. (9)
Например: информационному слову I =[1 0 1 0] соответствует следующее кодовое слово
.
(10)
При этом, информационная часть остается без изменений, а корректирующие разряды определяются путем суммирования по модулю два тех строк проверочной матрицы, номера которых совпадают с номерами разрядов, содержащих единицу в информационной части кода.
Процесс декодирования состоит в определении соответствия принятого кодового слова, переданному информационному. Это осуществляется с помощью проверочной матрицы H(n, k).
,
(11)
где RmkT -транспонированная проверочная матрица (поменять строки на столбцы); Imm - единичная матрица.
Для (7, 4)- кода проверочная матрица имеет вид
.
(12)
Между G(n ,k) и H(n, k) существует однозначная связь, т. к. они определяются в соответствии с правилами проверки, при этом для любого кодового слова должно выполняться равенство cHT = 0.
Строки проверочной матрицы определяют правила формирования проверок. Для (7, 4)-кода
p1Å+a1Å+a2Åa4 = S1 ;
p2Å+a1Å+a2Åa3 = S2 ; (13)
p3Å+a1Å+a3Åa4 = S3 .
Полученный синдром сравниваем со столбцами матрицы и определяем разряд, в котором произошла ошибка, номер столбца равен номеру ошибочного разряда. Для исправления ошибки ошибочный бит необходимо проинвертировать.
Совершенные и квазисовершенные коды. Код Хэмминга.
Групповой
-код,
исправляющий все ошибки веса, не большего
,
и никаких других, называется совершенным.
Свойства совершенного кода2:
Для совершенного -кода, исправляющего все ошибки веса, не большего , выполняется соотношение
.
Верно и обратное утверждение;Совершенный код, исправляющий все ошибки веса, не большего , в столбцах таблицы декодирования содержит все слова, отстоящие от кодовых на расстоянии, не большем . Верно и обратное утверждение;
Таблица декодирования совершенного кода, исправляющего все ошибки в не более чем позициях, имеет в качестве лидеров все строки, содержащие не более единиц. Верно и обратное утверждение.
Совершенный
код - это лучший код, обеспечивающий
максимум минимального расстояния между
кодовыми словами при минимуме длины
кодовых слов. Совершенный код легко
декодировать: каждому полученному слову
однозначно ставится в соответствие
ближайшее кодовое. Чисел
,
и
,
удовлетворяющих условию совершенности
кода очень мало. Но и при подобранных
,
и
совершенный
код можно построить только в исключительных
случаях.
Если
,
и
не
удовлетворяют условию совершенности,
то лучший групповой код, который им
соответствует называется квазисовершенным,
если он исправляет все ошибки кратности,
не большей
,
и некоторые ошибки кратности
.
Квазисовершенных кодов также очень
мало.
Двоичный блочный -код называется оптимальным, если он минимизирует вероятность ошибочного декодирования. Совершенный или квазисовершенный код - оптимален. Общий способ построения оптимальных кодов пока неизвестен.
Для
любого целого положительного числа
существует
совершенный
-код,
исправляющий одну ошибку, называемый
кодом Хэмминга (Hamming), в котором
и
.
Действительно,
.
Порядок построения кода Хэмминга следующий:
Выбираем целое положительное число . Сообщения будут словами длины , а кодовые слова - длины ;
В каждом кодовом слове
бит
с индексами-степенями двойки
-
являются контрольными, остальные - в
естественном порядке - битами сообщения.
Например, если
,
то биты
-
контрольные, а
-
из исходного сообщения;Строится матрица
из
строк
и
столбцов.
В
-ой
строке стоят цифры двоичного представления
числа
.
Матрицы для r=2, 3 и 4 таковы:
Записывается система уравнений
,
где
-
матрица из предыдущего пункта. Система
состоит из
уравнений.
Например, для
:
Чтобы закодировать сообщение
,
берутся в качестве
,
не
равно степени двойки, соответствующие
биты сообщения и отыскиваются, используя
полученную систему уравнений, те
,
для которых
-
степень двойки. В каждое уравнение
входит только одно
,
.
В выписанной системе
входит
в 1-е уравнение,
-
во второе и
-
в третье. В рассмотренном примере
сообщение
будет
закодировано кодовым словом
.
Декодирование
кода Хэмминга проходит по следующей
схеме. Пусть принято слово
,
где
-
переданное кодовое слово, а
-
строка ошибок. Так как
,
то
.
Если результат нулевой, как происходит
при правильной передаче, считается, что
ошибок не было. Если строка ошибок имеет
единицу в
-й
позиции, то результатом произведения
будет
-я
строка матрицы
или
двоичное представление числа
.
В этом случае следует изменить символ
в
-й
позиции слова
,
считая позиции слева, с единицы.
Пример.
-код
Хэмминга имеет в качестве одного из
кодовых слов
.
Матрица
приведена
на шаге 3 хода построения кода Хэмминга.
Ясно, что
.
Добавим к
строку
ошибок
.
Тогда
и
,
т.е. ошибка находится в третьей позиции.
Если
,
то
и
позиция ошибки -
и
т.п. Если ошибка допущена в более чем в
одной позиции, то декодирование даст
неверный результат.
Код Хэмминга - это групповой код.
Это
следует из того, что
-код
Хэмминга можно получить матричным
кодированием, при помощи
-матрицы,
в которой столбцы с номерами не степенями
2 образуют единичную подматрицу. Остальные
столбцы соответствуют уравнениям шага
4 построения кода Хэмминга, т.е. 1-му
столбцу соответствует уравнение для
вычисления 1-го контрольного разряда,
2-му - для 2-го, 4-му - для 4-го и т.д. Такая
матрица будет при кодировании копировать
биты сообщения в позиции не степени 2
кода и заполнять другие позиции кода
согласно схеме кодирования Хэмминга.
Пример. Кодирующая матрица для -кода Хэмминга -
Ее
столбцы с номерами 3, 5, 6 и 7 образуют
единичную подматрицу. Столбцы с номерами
1, 2 и 4 соответствуют уравнениям для
вычисления контрольных бит, например,
уравнению
соответствует
столбец 1101, т.е. для вычисления первого
контрольного разряда берутся 1, 2 и 4 биты
исходного сообщения или биты 3, 5 и 7 кода.
К
-коду
Хэмминга можно добавить проверку
четности. Получится
-код
с наименьшим весом ненулевого кодового
слова 4, способный исправлять одну и
обнаруживать две ошибки.
Коды
Хэмминга накладывают ограничения на
длину слов сообщения: эта длина может
быть только числами вида
:
1, 4, 11, 26, 57,
Но
в реальных системах информация передается
байтам или машинными словами, т.е.
порциями по 8, 16, 32 или 64 бита, что делает
использование совершенных кодов не
всегда подходящим. Поэтому в таких
случаях часто используются квазисовершенные
коды.
Квазисовершенные -коды, исправляющие одну ошибку, строятся следующим образом. Выбирается минимальное так, чтобы
Каждое
кодовое слово такого кода будет содержать
контрольных
разрядов. Из предыдущих соотношений
следует, что
Каждому
из
разрядов
присваивается слева-направо номер от
1 до
.
Для заданного слова сообщения составляются
контрольных
сумм
по
модулю 2 значений специально выбранных
разрядов кодового слова, которые
помещаются в позиции-степени 2 в нем:
для
выбираются
разряды, содержащие биты исходного
сообщения, двоичные числа-номера которых
имеют в
-м
разряде единицу. Для суммы
это
будут, например, разряды 3, 5, 7 и т.д., для
суммы
-
3, 6, 7 и т.д. Таким образом, для слова
сообщения
будет
построено кодовое слово
.
Обозначим
сумму
по модулю 2 разрядов полученного слова,
соответствующих контрольной сумме
и
самой этой контрольной суммы. Если
,
то считается, что передача прошла без
ошибок. В случае одинарной ошибки
будет
равно двоичному числу-номеру сбойного
бита. В случае ошибки, кратности большей
1, когда
,
ее можно обнаружить. Подобная схема
декодирования не позволяет исправлять
некоторые двойные ошибки, чего можно
было бы достичь, используя схему
декодирования с лидерами, но последняя
значительно сложнее в реализации и дает
незначительное улучшение качества
кода.
Пример
построения кодового слова квазисовершенного
-кода,
исправляющего все однократные ошибки,
для сообщения 100011010.
Искомое
кодовое слово имеет вид
.
Далее нужно вычислить контрольные
суммы.
Таким образом, искомый код - 0011000111010. Если в процессе передачи этого кода будет испорчен его пятый бит, то приемник получит код 0011100111010. Для его декодирования опять вычисляются контрольные суммы:
Приемник преобразует изменением пятого бита полученное сообщение в отправленное передатчиком, из которого затем отбрасыванием контрольных разрядов восстанавливает исходное сообщение.
Совершенный
код Хэмминга также можно строить по
рассмотренной схеме, т.к. для него
.
Для
исправление одинарной ошибки к
8-разрядному коду достаточно приписать
4 разряда (
),
к 16-разрядному - 5, к 32-разрядному - 6, к
64-разрядному - 7.
Полиномиальные коды. БЧХ коды.
При полиномиальном кодировании каждое сообщение отождествляется с многочленом, а само кодирование состоит в умножении на фиксированный многочлен. Полиномиальные коды - блочные и отличаются от рассмотренных ранее только алгоритмами кодирования и декодирования.
Пусть
-
двоичное сообщение. Тогда сопоставим
ему многочлен
.
Все вычисления происходят в поле классов
вычетов по модулю 2, т. е. от результата
любой арифметической операции берется
остаток от его деления на 2.
Например,
последовательности 10011 при
соответствует
многочлен
.
Зафиксируем некоторый многочлен степени ,
Полиномиальный
код
с кодирующим многочленом
кодирует
слово сообщения
многочленом
или
кодовым словом из коэффициентов этого
многочлена
.
Условия
и
необходимы,
потому что в противном случае
и
не
будут нести никакой информации, т.к. они
всегда будут нулями.
Пример.
Рассмотрим кодирующий многочлен
.
Сообщение 01011, отвечающее многочлену
,
будет закодировано коэффициентами
многочлена
,
т.е.
.
Полиномиальный
код с кодирующим многочленом
степени
является
матричным кодом с кодирующей матрицей
размерности
:
Т
е. ненулевые элементы в
-й
строке - это последовательность
коэффициентов кодирующего многочлена,
расположенных с
-го
по
-й
столбцах.
Например,
-код
с кодирующим многочленом
отвечает
матрице
или
отображению:
;
;
;
;
;
;
;
.
Полиномиальные коды являются групповыми.
Это следует из того, что коды, получаемые матричным кодированием, - групповые.
Рассмотрим
-код
с кодирующим многочленом
.
Строка ошибок
останется
необнаруженной в том и только в том
случае, если соответствующий ей многочлен
делится
на
.
Действительно,
делится
на
тогда
и только тогда, когда
делится
на
.
Поэтому любая ошибка, многочлен которой
не делится на
,
будет обнаружена и, соответственно,
любая ошибка, многочлен которой делится
на
,
не может быть обнаружена.
Таким образом, обнаружение ошибки при использовании полиномиального кода с кодирующим многочленом может быть реализовано при помощи алгоритма деления многочленов с остатком: если остаток ненулевой, то при передаче произошло искажение данных.
Коды
Хэмминга можно строить как полиномиальные,
например, кодирующий многочлен
определяет
совершенный
-код,
отличный от рассмотренного ранее.
Вообще
же, если кодирующий многочлен
,
порождающий соответствующий
-код,
не является делителем ни одного из
многочленов вида
при
,
то минимальное расстояние между кодовыми
словами порожденного им кода не меньше
3.
Пусть
-
минимальное расстояние между кодовыми
словами, оно равно минимуму среди весов
ненулевых кодовых слов. Предположим
.
Тогда существует
такой,
что
и
степень
не
больше
.
Вес
равен
2, поэтому
и
.
Следовательно,
,
что означает, что
должен
делиться на
,
а это невозможно по условию. Если
предположить, что
,
то это приведет к утверждению о том, что
должен
делиться на
,
что тоже противоречит условию. Итак,
.
Кодирующий
многочлен
определяет
совершенный
-код
Голея (Golay) с минимальным расстоянием
между кодовыми словами 7.
В 1971 году финскими и советскими математиками было доказано3, что кроме кодов Хэмминга и Голея других совершенных кодов нет.
Наиболее
интересными среди полиномиальных кодов
являются циклические
коды,
в которых вместе с любым кодовым словом
вида
есть
кодовое слово
.
Остался открытым вопрос о методике построения кодов, минимальное расстояние между кодовыми словами которых равно заданному числу. В 1960 году независимо Боуз (Bose), Чоудхури (Chaudhuri) и Хоккенгем (Hocquengem) открыли способ построения полиномиальных кодов, удовлетворяющих таким требованиям. Эти коды получили названия кодов Боуза-Чоудхури-Хоккенгема или БЧХ-кодов (BCH codes). БЧХ-коды могут быть не только двоичными, например, на практике достаточно широко используются недвоичные коды Рида-Соломона (Reed, Solomon), но далее будут рассматриваться только двоичные.
Многочлен
степени
называется
примитивным, если
делится
на
без
остатка для
и
не делится ни для какого меньшего
значения
.
Например,
многочлен
примитивен:
он делит
,
но не делит
при
.
Примитивен также многочлен
-
он делит
,
но не делит
при
.
Кодирующий
многочлен
для
БЧХ-кода, длина кодовых слов которого
,
строится так. Находится примитивный
многочлен минимальной степени
такой,
что
или
.
Пусть
-
корень этого многочлена, тогда рассмотрим
кодирующий многочлен
,
где
-
многочлены минимальной степени, имеющие
корнями соответственно
.
Построенный кодирующий многочлен производит код с минимальным расстоянием между кодовыми словами, не меньшим , и длиной кодовых слов n [1].
Пример.
Нужно построить БЧХ-код с длиной кодовых
слов
и
минимальным расстоянием между кодовыми
словами
.
Степень примитивного многочлена равна
и
сам он равен
.
Пусть
-
его корень, тогда
и
-
также его корни. Минимальным многочленом
для
будет
.
Следовательно,
Степень
полученного многочлена равна 8,
следовательно, построенный БЧХ-код
будет
-кодом.
Слово 1000100 или
будет
закодировано кодовым словом
или
111001100000100.
Можно
построить1
двоичный БЧХ-код с кодовыми словами
длины
и
нечетным минимальным расстоянием
,
у которого число контрольных символов
не
больше
.
Первый
БЧХ-код, примененный на практике, был
-кодом,
исправляющим ошибки кратности до 5, но
наиболее широкое распространение
получил
-код,
обнаруживающий ошибки кратности до 6.
БЧХ-коды умеренной длины не слишком далеки от совершенных или квазисовершенных кодов. Коды Хэмминга, например, являются БЧХ-кодами, а БЧХ-коды с минимальным весом кодового слова 5 - квазисовершенны. Но с ростом длины кодовых слов качество БЧХ-кодов падает. Код Голея, например, - это не код БЧХ.
Код Фэно
Состоит в том, что сообщения располагаются в порядке убывания вероятностей и полученный ряд делится на 2 части с вероятностями, по возможности близкими друг к другу. В качестве 1-го двоичного знака принимают 0 в 1-й части и 1 — во 2-й. Подобным же образом делят пополам каждую из частей и выбирают 2-й двоичный знак и т.д., пока не придут к частям, содержащим только по одному сообщению. Пример 1. Пусть n = 4 и p1=9/16, р2 = р3 = 3/16, p4= 1/16. Применение метода иллюстрируется таблицей 1:
Таблица 1 – Метод Шенона-Фено
х, |
Pi |
Кодовое обозначение |
||
х1 |
9/16 |
0 |
|
|
х2 |
3/16 |
1 |
0 |
|
х3 |
3/16 |
1 |
1 |
0 |
х3 |
1/16 |
1 |
1 |
1 |
B
данном случае L =
=
1,688 и можно показать, что никакой др. код
не даёт меньшего значения. В то же время
Н
=
1,623. Всё сказанное применимо и к случаю,
когда алфавит нового кода содержит не
2, как предполагалось выше, а m
>
2 букв. При этом лишь величина Н
в формулах (1) и (2) должна быть заменена
величиной H/log2m.
Кодирование, минимизирующее избыточность кода, называется оптимальным.
Вопрос существования таких кодов составляет суть одной из основных теорем теории информации – теоремы кодирования, доказанной К. Шенноном. Приведем одну из эквивалентных формулировок данной теоремы.
Теорема
кодирования.
Сообщения
произвольного источника информации Z
с энтропией H(Z)
всегда можно закодировать последовательностями
в алфавите B,
состоящем из M символов,
так,
что средняя длина кодового слова
будет
сколь угодно близка к величине
,
но не меньше нее.
Доказательство этой теоремы в силу его сложности не рассматривается.
Теорема
утверждает, что разность
можно
сделать как угодно малой. В этом и
заключается задача методов оптимального
кодирования.
Вернемся
к рассмотрению алфавитного источника
информации, генерирующего сообщения в
символах алфавита А.
Поскольку избыточность кода
задается
формулой
,
очевидно, что чем меньше , тем оптимальнее код. Для уменьшения следует кодировать часто встречающиеся символы более короткими словами и наоборот. На соблюдении этого требования основаны все методы оптимального кодирования. Кроме того, для обеспечения декодирования неравномерного кода важно соблюдать принцип префиксности: никакое кодовое слово не должно являться началом другого кодового слова.
Приведем
два наиболее известных метода оптимального
побуквенного кодирования. Для простоты
изложения возьмем двоичный алфавит
в
качестве кодового.
Шаг 1. Упорядочиваем символы исходного алфавита в порядке невозрастания их вероятностей. (Записываем их в строку.)
Шаг 2. Не меняя порядка символов, делим их на две группы так, чтобы суммарные вероятности символов в группах были по возможности равны.
Шаг 3. Приписываем группе слева "0", а группе справа "1" в качестве элементов их кодов.
Шаг 4. Просматриваем группы. Если число элементов в группе более одного, идем на Шаг 2. Если в группе один элемент, построение кода для него завершено.
Рис. 4.1. Двоичное дерево, соответствующее кодированию по методу Шеннона – Фано
Рассмотрим
работу описанного алгоритма на примере
кодирования алфавита
,
символы которого встречаются с
вероятностями (0,25; 0,05; 0,25; 0,1; 0,25; 0,1)
соответственно. Результат кодирования
изображен на рис. 4.1.
Очевидно, что процесс построения кода в общем случае содержит неоднозначность, так как мы не всегда можем поделить последовательность на два равновероятных подмножества. Либо слева, либо справа сумма вероятностей будет больше. Критерием лучшего варианта является меньшая избыточность кода. Заметим также, что правильное считывание кода – от корня дерева к символу – обеспечит его префиксность.
Криптография
Криптогра́фия (от κρυπτός — скрытый и γράφω — пишу) — наука о методах обеспечения конфиденциальности (невозможности прочтения информации посторонним) и аутентичности (целостности и подлинности авторства, а также невозможности отказа от авторства) информации.
Изначально криптография изучала методы шифрования информации — обратимого преобразования открытого (исходного) текста на основе секретного алгоритма и/или ключа в шифрованный текст (шифртекст). Традиционная криптография образует раздел симметричных криптосистем, в которых зашифрование и расшифрование проводится с использованием одного и того же секретного ключа. Помимо этого раздела современная криптография включает в себя асимметричные криптосистемы, системы электронной цифровой подписи (ЭЦП), хеш-функции, управление ключами, получение скрытой информации, квантовую криптографию.
Криптография не занимается: защитой от обмана, подкупа или шантажа законных абонентов, кражи ключей и других угроз информации, возникающих в защищенных системах передачи данных.
Криптография — одна из старейших наук, ее история насчитывает несколько тысяч лет.
Терминология
Открытый (исходный) текст — данные (не обязательно текстовые), передаваемые без использования криптографии.
Шифрованный (закрытый) текст — данные, полученные после применения криптосистемы с указанным ключом
Криптосистема — семейство обратимых преобразований открытого текста в шифрованный.
Ключ — параметр шифра, определяющий выбор конкретного преобразования данного текста. В современных шифрах алгоритм шифрования известен, и криптографическая стойкость шифра целиком определяется секретностью ключа (Принцип Керкгоффса).
Криптоанализ — наука, изучающая математические методы нарушения конфиденциальности и целостности информации.
Криптоаналитик — человек, создающий и применяющий методы криптоанализа.
Криптография и криптоанализ составляют криптологию, как единую науку о создании и взломе шифров (такое деление привнесено с запада, до этого в СССР и России не применялось специального деления).
Криптографическая атака — попытка криптоаналитика вызвать отклонения в атакуемой защищенной системе обмена информацией. Успешную криптографическую атаку называют взлом или вскрытие.
Шифрование — процесс нормального применения криптографического преобразования открытого текста на основе алгоритма и ключа, в результате которого возникает шифрованный текст.
Расшифровывание — процесс нормального применения криптографического преобразования шифрованного текста в открытый.
Дешифрование (дешифровка) — процесс извлечения открытого текста без знания криптографического ключа на основе известного шифрованного. Термин дешифрование обычно применяют по отношению к процессу криптоанализа шифротекста (криптоанализ сам по себе, вообще говоря, может заключаться и в анализе шифросистемы, а не только зашифрованного ею открытого сообщения).
Криптографическая стойкость — способность криптографического алгоритма противостоять криптоанализу.
Имитозащита — защита от навязывания ложной информации. Имитозащита достигается обычно за счет включения в пакет передаваемых данных имитовставки.
Имитовставка — блок информации, применяемый для имитозащиты, зависящий от ключа и данных. В частном случае обеспечивается ЭЦП.
Асимметричный шифр - шифр, являющийся асимметричной криптографической системой.
Стандарт шифрования данных
Кодировка текстовой информации
Если каждому символу алфавита сопоставить определенное целое число (например, порядковый номер), то с помощью двоичного кода можно кодировать и текстовую информацию. Восемь двоичных разрядов достаточно для кодирования 256 различных символов. Этого хватит, чтобы выразить различными комбинациями восьми битов все символы английского и русского языков как строчные, так и прописные, а также знаки препинания, символы основных арифметических действий и некоторые общепринятые специальные символы, например, символ «§».
Технически это выглядит очень просто, однако всегда существовали достаточно веские организационные сложности. В первые годы развития вычислительной техники они были связаны с отсутствием необходимых стандартов, а в настоящее время вызваны, наоборот, изобилием одновременно действующих и противоречивых стандартов. Для того чтобы весь мир одинаково кодировал текстовые данные, нужны единые таблицы кодирования, а это пока невозможно из-за противоречий между символами национальных алфавитов, а также противоречий корпоративного характера.
Для английского языка, захватившего де-факто нишу международного средства общения, противоречия уже сняты. Институт стандартизации США (ANSI—AmericanNationalStandardInstitute) ввел в действие систему кодирования ASCII(AmericanStandardCodeforInformationInterchange– стандартный код информационного обмена США). В системе ASCIIзакреплены две таблицы кодирования – базовая и расширенная. Базовая таблица закрепляет значения кодов от 0 до 127, а расширенная относится к символам с номерами от 128 до 255.
Первые 32 кода базовой таблицы, начиная с нулевого, отданы производителям аппаратных средств (в первую очередь производителям компьютеров и печатающих устройств). В этой области размещаются так называемые управляющие коды, которым не соответствуют никакие символы языков, и, соответственно, эти коды не выводятся ни на экран, ни на устройства печати, но ими можно управлять тем, как производится вывод данных.
Начиная с кода 32 по код 127 размещены коды символов английского алфавита, знаков препинания, цифр, арифметических действий и некоторых вспомогательных символов. Русские буквы в таблице ASCII имеют следующие коды:
А – 10000000 И – 10001000 Р – 10010000
Б – 10000001 Й – 10001001 С – 10010001
В – 10000010 К – 10001010 Т – 10010010
Г – 10000011 Л – 10001011 У – 10010011
Д – 10000100 М – 10001100 Ф – 10010100
Е – 10000101 Н – 10001101 Х – 10010101
Ж – 10000110 О – 10001110 Ю – 10011110
З – 10000111 П – 10001111 Ь – 10011100 и т.д.
Аналогичные системы кодирования текстовых данных были разработаны и в других странах. Например, в СССР в этой области действовала система кодирования КОИ-7 (код обмена информацией, семизначный). Однако поддержка производителей оборудования и программ вывела американский код ASCIIна уровень международного стандарта, и национальным системам кодирования пришлось «отступить» за вторую, расширенную часть системы кодирования, определяющую значения кодов от 128 по 255. Отсутствие единого стандарта в этой области привело к множественности одновременно действующих кодировок. Только в России можно указать три действующих стандарта кодировки и еще два устаревших.
Например, кодировка символов русского языка, известная как кодировка Windows-1251, была введена «извне» – компанией Microsoft, но, учитывая широкое распространение операционных систем и других продуктов этой компании в России, она глубоко закрепилась и нашла широкое распространение. Эта кодировка используется на большинстве локальных компьютеров, работающих на платформе Windows.
Другая распространенная кодировка носит название КОИ-8 (код обмена информацией, восьмизначный) –ее происхождение относится к временам действия Совета Экономической Взаимопомощи государств Восточной Европы. Сегодня кодировка КОИ-8 имеет широкое распространение в компьютерных сетях на территории России и в российском секторе Интернета.
Международный стандарт, в котором предусмотрена кодировка символов русского алфавита, носит название кодировки ISO (InternationalStandardOrganization– Международный институт стандартизации). На практике данная кодировка используется редко.
На компьютерах, работающих в операционных системах MS-DOS, могут действовать еще две кодировки (ГОСТ– кодировка и ГОСТ–альтернативная). Первая из них считалась устаревшей даже в первые годы появления персональной вычислительной техники, но вторая используется и по сей день.
В связи с изобилием систем кодирования текстовых данных, действующих в России, возникает задача межсистемного преобразования данных – это одна из распространенных задач информатики.
Если проанализировать организационные трудности, связанные с созданием единой системы кодирования текстовых данных, то можно прийти к выводу, что они вызваны ограниченным набором кодов (256). Если, например, кодировать символы не восьмиразрядными двоичными числами, а числами с большим количеством разрядов, то и диапазон возможных значений кодов станет намного больше. Такая система, основанная на 16-разрядном кодировании символов, получила название универсальной – UNICODE. Шестнадцать разрядов позволяют обеспечить уникальные коды для 65536 различных символов – этого поля достаточно для размещения в одной таблице символов большинства языков планеты.
Несмотря на тривиальную очевидность такого подхода, простой механический переход на данную систему долгое время сдерживался из-за недостаточных ресурсов средств вычислительной техники (в системе кодирования UNICODEвсе текстовые документы автоматически становятся вдвое длиннее). Во второй половине 90-х годов технические средства достигли необходимого уровня обеспеченности ресурсами, и сегодня мы наблюдаем постепенный перевод документов и программных средств на универсальную систему кодирования. Для индивидуальных пользователей это еще больше добавило забот по согласованию документов, выполненных в разных системах кодирования, с программными средствами, но это надо понимать как трудности переходного периода.
