Искусство программирования на Си (984073), страница 56
Текст из файла (страница 56)
За исключсни- отдельное колонов слово, и поэтому в действительносем того же за'ол'вка Гах Ь козоРый нспользов "и в ти требуется только 91 Отдельное значе!„„первьн! программе колирования, программа десоде.с содержит очевилный шаг реализации этого — использование зна- (4 ыЬгве 04г'в(гео( *Е4 ыь(ге 04 только стандартные заголовки С и Реализована в лиле чений от б до б3 лля представления текущих длин окоединого файла исходного кода. нечнь!х кодов.
Составные кодовые слова могут быть Как и Ранее, тип стРУктУРы ланных дла пРелстав- прелставлены путем использования нескольких методов. ления кодовых слов Т.4 определяется в начале файла, По мере того как программа бкп за битом создает ФуНКцИя ПЗЛ!ПО Примененный в этой программе метод учитывает то но и тип стРУктУРы, н оРганизациа массивов таблицы обстоятельство, что длина составных коловых слов всепо!снциальное кодовое слов из входного файла, из этого В этой программе функция пзашп также является прополстановок значительно отличаются оз опрелеленных .
04 б гда кратна ез остатка. сли длину кодовых слов массива выбирается стру~тура СОВЕ ТАВьЕ для соот- етым лрайве ом. Она определяет буфер вывода, кото- Р Р Доно»неготовые п~емогпинееное ргаде.еы Фй— Часть Н( Опробо~пло цнфровыгеогнагов ф)й4$~$ — ° Глава 18 ЯЙФ ( яыктсЬ (ргхе1 тип) риьз("вань(пд Ьпг61а1 ЕОЬ ); ( гесигп ЕОР/ сазе Т4 ЕОР» ) рига( бесодее ипехресгей еиб о( Ше ); гесигп ЕОР! /» Счетыванве, деходированве в вывод закодврованамх скавврованвмх строк одаод вслед за другой */ саяе Т4 ЕОЬ« (ог (Ках 1лпеэ = 61 лах 1гпео < НАХ1НОН ВОНЯ1 /* Обнаруленве ходового слова ЕОЬ корректно в двух случаях: паоле декодврованвя ( кодовых слов в точности для 1728 пвкселов */ ыаптеб = МЕЬТЕ МЛНТЕО1 /* строки начанавтся с белых последовательностей */ 11 (Р1ХЕЬЕ РЕВ ВОМ = р»хе1 соипс) оиь ртг = Ьи(У; /» вывод аачваается саазала «/ ( рлхе1 соипс = О; /' в вовой строке пвхселы отсутствуют */ ++(ах 1лпея1 Оо (ыг1те(ЬиЕ(, 1, ОСТЕТБ РЕВ ВОМ, Таис); ( ++сор соипс1 ргхе1 гии = СеГРЬхе1Вип(ыапсед, Туп)7 ) гу (рлохе1 гип >= О) /* ...в после декодлрованвя пвкселов О после предаествувцего кода ЕОЬ, поскольку весть ( последовательных кодов ЕОЬ в страхе без каках-лабо нных нансенов мелду нема свгвалвзврувт о еор сопок = О; /' паследоватепьвоств пвкселов после последнега ЕОЬ */ конце страницы */ 1( ((Коса1 тип = ргхе1 гип) > 63) е1не 11 (О == руке1 салос) ( ( /* Еслв количество только что декодироваванх пвхселов в последовательаоств больве ЬТ (++еор соипс >« 6) 63, последовательность является составным кодом в за вей всегда следует оковечннй код дпя ( этого ле цвета.
Поэтому функцвя ОеКРххе1дип вызывается снова с этим ке цветом дпя получеавя гекигп (ах 11пея; обцей длввы последовательности »/ ) //оно сн та санные теист инес ние розданы Обрабпина ци4рсеынсиенссоа Часть 1и Глава 18 пода, приводя к неопределенному поведению. Если сб- на наличие ошибки. Фактически функция завершается п(п Ьгкз = 4; /* мввпмальвая дивна кодового слова дпя белых пвксепов */ шая длина последовательностей, определенная для ска- при первой же ошибке, что, вероятно. будет вызывать вах Ыгз = 9; /* мвхсвмальвая длвва кодового слова для белых пвкселов «/ нированной строки, превышает лопустимую длину, нарекания пользователей режпьиого факсимильного ап- ) программа останавливается с выводом сообшения об парата.
Возможно, лучшим полходолс был бы просмотр (ог (; 1 ) /* до момевта обварухевая кодового слова ппв опвбхв ( ; 1 ) /* б в кодового слова ппв опвбхв '/ ошибке. закодированного потока на предмет наличия, по край( Когда сканированная строка начинается с черного ней мере, 11 последовательных битоп О, указывающих, до пиксела, функция Оесш)еРайеО не проверяет наличие что следуюший прибывавший единичный бит сигнати- ( последовательностей белых пикселов нулевой длины. зирует о конце строки (ЕОЕ).
Во многих случаях лопумевьпев мере, одвп раз, поэтому фувкцвя Сегпехквгк() будет всегда вызываться прв хахдом Она просто передает значение функции Оп(рп(Р)хе(зО, стима, чтобы одна или несколько сканированных строк прохопдеввв цвкпа, даве еслв длвва создаваемого кодового слова которая ниче|о ие делает, если ей передана последова- были утеряны при сохранении основной части изобра- ку ((зехк ЫГ = Секвехевгк(укп)) == 94 ВОР) тельность пикселов любого цвета нулевой ллины.
жения страницы ( Переменная еор совп1 используется для распознава- гекогп т4 ВОу. Ння ПОСЛЕдОВатЕЛЬНОСтн КОНца СтраинцЫ, СОСтОящей ИЗ ©Уидцид ыб(Р(ХВ)мПП() ) е1зе шести послеловательныл коловых слов ЕОЕ без каких- Функция Ое(Р!хе!)(пп(), приведенная в листинге (ь.б, либо иных ппкселов данных между нплси. Ее значение вызывается с параметром Р!ХЕЕ ЮА)и)ТЕ0, укззываю- соде чогд = (соде чогб « 1) ! лехе Ьзк; увеличивается при кажлом обнаружении последователь- шим найденный цвет, и указателем нз входной файл, ) ности ЕОЕ и сбрасывается обратно в нуль при извлсче- зти же аргументы она прямо передаст функции ) чв11е [++Ыкз < мга Ьгез)1 нии любых пикселов данных.
Если значение сор сопи( Ое()Чех(В((О. Функция Ое(Р(хе)йвпО инициализирует /' дах только ходовое слово становится достаточво длпваым, его веобходвмо сравввть с ВОЬ */ достигает шести, страница завершается. несколько перечисленных ниже переменных. 11 (ьггз >= воь ьввптв ка соде чогд == 1) Обрааони Дооооиитеим~не таиаа)ииееиие раздеан Щ~ Часть и1 Первоначально цикл до..лтЫ!еОв верхней части основ- соответствует длине составного колового слова, функ- Листинг !8.7.
функция ме(Мех(В)(!). ного цикла будет вызывать функцию Се[)з(ел[В([О дваж- ция распаковывает сго (слово) в обычное целое значс- леае(с тпе лы для последовательностей черных и четыре раза — нне, диапазон которого составляет от 64 до 172К Пос- Сееяехепте(Р1ЬВ етхп) лля послсдоватсльностсй белых пиксслов. Возвращаемые ле этого функция возвращает длину последовательности.
( биты сдвигаются в псрсмснную собс тиогй справа. Как лева!с (пе Ыся плед = РРХВЬВ РВП ветку; аеа11с оплзвпед 1пс 14 гп; только количсство битов в соде теогд становится раен гале УикЦнй ' п)прйгвй значснию ш)п Ыта, цикл прерывается. При каждом до- Эта очень короткая функция имеет дескриптор соотвстполнительном выполнении внсшнсго цикла цикл ствияфункцииобратной связи, необходимыйлляфунк- /* Проверха валвчвя. оставввхся батов и текуием охтете */ до...мййеО будет добавлять по олному биту к перемен- цин Ьаеагсй(). Первый параметр рощ[ег [о тоИ вЂ” это ной сойе моп), даже если значение Ы[з узка больше или псевдоним указателя на переменную собе теогд в фун- /* Вслв бвтов больве ае осталось, осуаествляется лолучевве нового октета вэ всходвого Файла '/ равно значению ш)п Ь)бх кции Ое(Р(хе)КппО.
Второй параметр — пссвлоним элс- [т [(тпрпе = !весе(т(п)) == ВОР) Затем выполняется проверка на назичис колового мента массива Т4 0ЕСОЕ)Е, содержашсго кодовые сло- ( слова ЕОЬ. Если 11 или болсс нулевых битов уже со- ва для соответствующего цвета с длиной, равной гетега т4 ВОР[ браны в переменную соде моей, заключительный ели- соде гтоп). ничный бит, завершающий послсдоватсльность ЕО!., е1ве атле1с [.пе тес,.м~ ага[сопле чогп *х, сопле чо1д *у) ( дсласт условие истинным и возвращается псречислимос /* После получеввя вового октета вмполвяется масквровавие восьмв младввх битов */ */ значение Т4 ЕОЬ.
гетпгп *(!пт «)х — (!пт)((т( ПВСОПВ и)у)-> 14 тп = [прок а Оетят Иааа> Если последовательность ЕОЬ нс выявлена, выпол- Ьхс расеегп; /' Пвкакие бвтм вэ этого октета еве ве вспольэовалвсь '/ настоя проверка на натичис ошибочных входных дан- ) Ь11в плед ОГ доаолиа оелтале тематетеекае раздета (яра 6 от го Чаф рог не ее го алое $ Часть )И Глава 1В Листинг 18.8. Функция Оц1рц1Р(ке(з(). Выявление и исправление ошибок ся в дпоичном вилс в электронных таблицах. Вначале они сжимаются, затем шифруются для обсспсчсния а1аькс ппа(дпеа сЬаг Дорогостоящую с точки зрения денег и трулозатрат безопасности. Внсшнс консчный поток данных вообще *Опсрпср1хе1а((пп 1епдСЬ, Р1ХВЬ ВАМТКР яаптеп', информацию необходимо надлсхоащим образом хра- нс имсст ничего общего с факплчсской информацией, ппв(дпее) сЬаг *апь ртг) ни ~ь.
получать и отправлять, иначе при возникновении и единственный ошибочный бит может сделать нсвоз- ( непредвиденных ситуаций можно узсрять важныс дан- можной расшифровку и распаковку данных в приголппа(дпее) (пс паакг ныс, сели вовремя не позаботиться о создании рсзсрв- ную для использования форму. атас1с гпс опЕЬ|тя 1е(1 = Р1ХВЬБ РКВ ОСТВТ1 ныл копий. Информация в цифровой или любой дрчаьа11с ппвкдпеа 1пс ргхе1 опт О; гон формс характеризуется высокой степенью ИЗбЫТОЧНОСТЬ 11 (ВЬАСК ВАВТВВ == яаптеа) организованности и низкой степенью энтропии. Но в Ключом к выявлению и исправлению ошибок служит из( соответствии с физическими законами энтропия вссгда бьыочность — добавзснис дополнительной информации паек О; повышается, сели только для предотвращения этого ) сверх минимально нсобходнмой для передачи нужных процесса нс затрачивается энергия.
е1ве ланныл. Пример "Нсйо ттогЫ" уже характсризустся значи- В атолл разделе речь пойдет об использовании языка ( тельной избыточносп,ю. В строке присутствуют только паек = Ох(1; С лля выполнсния задачи выявлсния и исправления восемь различных символов — "Н", "с", ")", "о", "%, "г", ) нсизбсжных ошибок при хранснии или псрсдачс дан"д" и символ пробела. Поскольку три бита могут содсржазь ных. Чтобы снова и снова нс повторять выражснис "храяЬг1е (1епдтЬ >= опГЬ)тя 1е(1) восемь различных комбинаций, можно было бы присвонснис и псрсдача данных", в дальнсйшсм для описания ( изъ 3-битовыс замещения лдя символов в привсдснной выше любой ситуации, когда в данные могут вкрасться ошнб- допоанотвавпые танаашнеениераадслы фЯ- 4 Часть П! Обрабоеана Нийровые онтатв М))(ОЯВ Глаеа 18 которые из наиболее часто используемых методик, на- тальных семи битов, можно бьшо бы выявить ошибку, Листинг 18.9.
Программа Рап1у.с, которая добавляет четный признак четности к символам, считанным чиная с самых ранних. изменившую зна1ение одного из битов. из 5<г)(п. Простейший способ лобаалсния избыточности для Применительно к дноичным значениям слово чет- (гас1ебе <ясб1о.к> любой обработки данных — дублирование. Фактичес- ность используется для описания количества елиничных (зас1абе <ясг1аО.Ь> ки именно этот способ лежит а основе создания рсзер- битов О двоичном значении.
иных копий. Такая технология вполне подходитдля дол- Октст, которьш содержит лаоичнос значение Ох), гоар<манного хранения данных, но значительно мсныпе — содержит восемь битов 0000000!. Как аидитс, октст < 1лс Еемр = О; для обмена и обработки особо важных данных а рсазь- содержит сдинстаснный единичный бит, а поскольку )— ном масшгабс времени. нечетное число, говорят, что этот октст яалястся нсчстЛаяайтс рассмотрим процесс дублирования, аыпол- ным. Обратите анилеание, что нсчетность или чстность /* Усечеаие самаела АОС11 де сема битом */ нясмый при обмене данными.
Вмссго одной копни никак нс связана с тем, является ли четным или нечет- файла а электронном аиде яыполнястся отдельная от- ным числовое значение октета. Октет, который содер/* устааоака заачеиия ееир рааамм О дяя четного призиака четаести или 1 — для нечетного праякадаух копий. Обе копии сравниваются, и если они жнт четное десятичное число 2, а двоичном прсдстаа- еризаака */ полностью совпадают, то с аысокои степенью ясроят- ленни аь1глялит как 000000(0 и является нечетным.