Как декодировать сообщение по таблице

Обновлено: 02.07.2024

Алфавитное неравномерное двоичное кодирование сигналами равной длительности. Префиксные коды

Как следует из названия, в способах кодировании, относящихся к этой группе, знаки первичного алфавита (например, русского) кодируются комбинациями символов двоичного алфавита (т.е. 0 и 1), причем, длина кодов и, соответственно, длительность передачи отдельного кода, могут различаться. Длительности элементарных сигналов при этом одинаковы %%(τ_0 = τ_1 = τ)%%. Очевидно, для передачи информации, в среднем приходящейся на знак первичного алфавита, необходимо время %%K(A,2) \cdot τ%%.

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

Каким образом она может быть декодирована? Если бы код был равномерным, приемное устройство просто отсчитывало бы заданное (фиксированное) число элементарных сигналов (например, 5, как в коде Бодо) и интерпретировало их в соответствии с кодовой таблицей. При использовании неравномерного кодирования возможны два подхода к обеспечению различимости кодов. Первый состоит в использовании специальной комбинации элементарных сигналов, которая интерпретируется декодером как разделитель знаков. Второй - в применении префиксных кодов. Рассмотрим подробнее каждый из подходов.

Неравномерный код с разделителем

Условимся, что разделителем отдельных кодов букв будет последовательность 00 (признак конца знака), а разделителем слов-слов - 000 (признак конца слова - пробел). Довольно очевидными оказываются следующие правила построения кодов:

  • код признака конца знака может быть включен в код буквы, поскольку не существует отдельно (т.е. кода всех букв будут заканчиваться 00);
  • коды букв не должны содержать двух и более нулей подряд в середине (иначе они будут восприниматься как конец знака);
  • код буквы (кроме пробела) всегда должен начинаться с 1;
  • разделителю слов (000) всегда предшествует признак конца знака; при этом реализуется последовательность 00000 (т.е., если в конце кода встречается комбинация . 000 или . 0000, они не воспринимаются как разделитель слов); следовательно, коды букв могут оканчиваться на 0 или 00 (до признака конца знака).

В соответствии с перечисленными правилами построим кодовую табл. 3.1 для букв русского алфавита, основываясь на приведенных ранее (табл. 2.1.) вероятностях появления отдельных букв.

Теперь можно найти среднюю длину кода К(r,2) для данного способа кодирования:

Поскольку для русского языка, %%I_1(r) = 4,356 бит%%, избыточность данного кода, согласно (3.5), составляет:

БукваКод%%p_j\cdot 10^3%%%%k_j%% БукваКод%%p_j\cdot 10^3%%%%k_j%%
пробел0001743я1011000187
о100903ы1011100167
е1000724з1101000167
а1100624ь,ъ1101100147
и10000625б1110000147
т10100535г1110100137
н11000535ч1111000127
с11100455й1111100107
р101000406х1010100098
в101100386ж1010110078
л110000356ю1011000068
к110100286ш1011010068
м111000266ц1011100048
д111100256щ1011110038
п1010000237э1101000038
у1010100217ф1101010028

Рассмотрев один из вариантов двоичного неравномерного кодирования, попробуем найти ответы на следующие вопросы: возможно ли такое кодирование без использования разделителя знаков? Существует ли наиболее эффективный (оптимальный) способ неравномерного двоичного кодирования?

Неравномерный код может быть однозначно декодирован, если никакой из кодов не совпадает с началом (префиксом*) какого-либо иного более длинного кода.

Пример.Пусть имеется следующая таблица префиксных кодов:

а л м р у ы
10010001101100111

Декодирование производится циклическим повторением следующих действий:

Применение данного алгоритма дает:


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

Что такое кодирование информации?

Кодирование данных – это обязательный этап в процессе сбора и обработки информации.

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

что такое кодирование и декодирование

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

Что такое декодирование информации?

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

способы кодирования и декодирования информации

Если во время кодирования данные приобретают вид символьных сигналов, которые полностью соответствуют передаваемому объекту, то при декодировании из кода изымается передаваемая информация или некоторые ее характеристики.

Кодирование и декодирование текстовой информации

При нажатии на клавиатурную клавишу компьютер получает сигнал в виде двоичного числа, расшифровку которого можно найти в кодовой таблице – внутреннем представлении знаков в ПК. Стандартом во всем мире считают таблицу ASCII.

кодирование графической информации декодирование

Однако мало знать, что такое кодирование и декодирование, необходимо еще понимать, как располагаются данные в компьютере. К примеру, для хранения одного символа двоичного кода электронно-вычислительная машина выделяет 1 байт, то есть 8 бит. Эта ячейка может принимать только два значения: 0 и 1. Получается, что один байт позволяет зашифровать 256 разных символов, ведь именно такое количество комбинаций можно составить. Эти сочетания и являются ключевой частью таблицы ASCII. К примеру, буква S кодируется как 01010011. Когда вы нажимаете ее на клавиатуре, происходит кодирование и декодирование данных, и мы получаем ожидаемый результат на экране.

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

кодирование числовой текстовой и графической информации декодирование

Кодирование чисел

В двоичной системе счисления, которую активно используют компьютеры, встречаются лишь две цифры – 0 и 1.

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

Примеры кодирования и декодирования чисел

Предлагаем рассмотреть 2 способа кодировки числа 45. Если эта цифра встречается в пределах текстового фрагмента, то каждая ее составляющая будет закодирована, согласно таблице стандартов ASCII, 8 битами. Четверка превратится в 01000011, а пятерка – в 01010011.

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

кодирование и декодирование текстовой информации

Кодирование графической информации

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

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

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

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

Подобный метод кодирования точек изображений применяется и в полиграфической отрасли. Только здесь принято задействовать четвертый цвет – черный. По этой причине полиграфическую систему преобразования обозначают аббревиатурой CMYK. Эта система для представления изображений использует целых тридцать два двоичных разряда.

процессы кодирования и декодирования

Способы кодирования и декодирования информации предполагают использование различных технологий, в зависимости от типа вводимых данных. К примеру, метод шифрования графических изображений шестнадцатиразрядными двоичными кодами называется High Color. Эта технология дает возможность передавать на экран целых двести пятьдесят шесть оттенков. Уменьшая количество задействованных двоичных разрядов, применяемых для шифрования точек графического изображения, вы автоматически уменьшаете объем, необходимый для временного хранения информации. Такой метод кодирования данных принято называть индексным.

Кодирование звуковой информации

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

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

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

Кодирование информации в двоичном коде

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

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

Преимущества двоичного кодирования

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

Недостатки двоичного кодирования

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

примеры кодирования и декодирования

Заключение

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

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

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

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

Примечание переводчика: под символом автор подразумевает некий повторяющийся элемент исходной строки — это может быть как печатный знак (character), так и любая битовая последовательность. Под кодом подразумевается не ASCII или UTF-8 код символа, а кодирующая последовательность битов.

К статье прикреплён исходный код, который наглядно демонстрирует, как работает алгоритм Хаффмана — он предназначен для людей, которые плохо понимают математику процесса. В будущем (я надеюсь) я напишу статью, в которой мы поговорим о применении алгоритма к любым файлам для их сжатия (то есть, сделаем простой архиватор типа WinRAR или WinZIP).

Идея, положенная в основу кодировании Хаффмана, основана на частоте появления символа в последовательности. Символ, который встречается в последовательности чаще всего, получает новый очень маленький код, а символ, который встречается реже всего, получает, наоборот, очень длинный код. Это нужно, так как мы хотим, чтобы, когда мы обработали весь ввод, самые частотные символы заняли меньше всего места (и меньше, чем они занимали в оригинале), а самые редкие — побольше (но так как они редкие, это не имеет значения). Для нашей программы я решил, что символ будет иметь длину 8 бит, то есть, будет соответствовать печатному знаку.

Мы могли бы с той же простотой взять символ длиной в 16 бит (то есть, состоящий из двух печатных знаков), равно как и 10 бит, 20 и так далее. Размер символа выбирается, исходя из строки ввода, которую мы ожидаем встретить. Например, если бы я собрался кодировать сырые видеофайлы, я бы приравнял размер символа к размеру пикселя. Помните, что при уменьшении или увеличении размера символа меняется и размер кода для каждого символа, потому что чем больше размер, тем больше символов можно закодировать этим размером кода. Комбинаций нулей и единичек, подходящих для восьми бит, меньше, чем для шестнадцати. Поэтому вы должны подобрать размер символа, исходя из того по какому принципу данные повторяются в вашей последовательности.

Для этого алгоритма вам потребуется минимальное понимание устройства бинарного дерева и очереди с приоритетами. В исходном коде я использовал код очереди с приоритетами из моей предыдущей статьи.

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

Для начала посчитаем частоты всех символов:

Символ Частота
'b' 3
'e' 4
'p' 2
' ' 2
'o' 2
'r' 1
'!' 1


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

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

Повторим те же шаги и получим последовательно:




Ну и после того, как мы свяжем два последних элемента, получится итоговое дерево:


Теперь, чтобы получить код для каждого символа, надо просто пройтись по дереву, и для каждого перехода добавлять 0, если мы идём влево, и 1 — если направо:

Если мы так сделаем, то получим следующие коды для символов:

Символ Код
'b' 00
'e' 11
'p' 101
' ' 011
'o' 010
'r' 1000
'!' 1001

Важно иметь в виду, что каждый код не является префиксом для кода другого символа. В нашем примере, если 00 — это код для 'b', то 000 не может оказаться чьим-либо кодом, потому что иначе мы получим конфликт. Мы никогда не достигли бы этого символа в дереве, так как останавливались бы ещё на 'b'.

На практике, при реализации данного алгоритма сразу после построения дерева строится таблица Хаффмана. Данная таблица — это по сути связный список или массив, который содержит каждый символ и его код, потому что это делает кодирование более эффективным. Довольно затратно каждый раз искать символ и одновременно вычислять его код, так как мы не знаем, где он находится, и придётся обходить всё дерево целиком. Как правило, для кодирования используется таблица Хаффмана, а для декодирования — дерево Хаффмана.

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

Все исходники были откомпилированы и проверены с использованием стандарта C99. Удачного программирования!

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

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

Примерами кодов являются последовательность букв в тексте, цифр в числе, двоичный компьютерный код и др.

Преобразование знаков или групп знаков одной знаковой системы в знаки или группы знаков другой знаковой системы называется перекодированием.

Кодирование может быть равномерным и неравномерным. При равномерном кодировании все символы заменяются кодами равной длины; при неравномерном кодировании разные символы могут кодироваться кодами разной длины (это затрудняет декодирование). Неравномерный код называют еще кодом переменной длины.

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

Коды Морзе для некоторых букв.

Чтобы избежать неоднозначности, код Морзе включает также паузы между кодами разных символов.

Декодирование информации

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

Для однозначного декодирования неравномерного кода важно, имеются ли в нем кодовые слова, которые являются одновременно началом других, более длинных кодовых слов.

Неравномерные коды, для которых выполняется условие Фано, называются префиксными. Префиксный код — такой неравномерный код, в котором ни одно кодовое слово не является началом другого, более длинного слова. В таком случае кодовые слова можно записывать друг за другом без разделительного символа между ними.

Например, код Морзе не является префиксным — для него не выполняется условие Фано. Поэтому в кодовый алфавит Морзе, кроме точки и тире, входит также символ–разделитель — пауза длиной в тире. Без разделителя однозначно декодировать код Морзе в общем случае нельзя.

Читайте также: