Семинары (1171138), страница 8
Текст из файла (страница 8)
создать копию бинарного файла путем последовательного чтения данных изоригинального файла и записи их в копию.2. написать программу побайтного сравнения двух файлов.Исходный кодРезультат выполнения3Пример 3: Первый вариант алгоритма сжатия без потерь RLE:Сжатие в RLE происходит за счет того, что в исходном файле встречаются цепочкиодинаковых байт. Замена их на пары <счетчик повторений, значение> уменьшаетизбыточность данных.
Рассмотрим, например, следующую строку: abbbbzzzzddaaaaaffffuuпосле применения группового сжатия эта последовательность будет преобразована в:1a4b4z2d5a4f2u. В данном алгоритме признаком счетчика (counter) служат единицы в двухверхних битах считанного байта. Соответственно оставшиеся 6 бит расходуются на счетчик,который может принимать значения от 1 до 64. Строку из 64 повторяющихся байтов мыпревращаем в два байта, т.е. сожмем в 32 раза. Если же кодируемая последовательностьсодержит единичный байт, значение которого больше 191, то он так же кодируется парой<счетчик, значение>.Алгоритм декомпрессии при этом выглядит так: считываем счетчикInitialization(...);do {byte = ImageFile.ReadNextByte();if(является счетчиком(byte)) {counter = Low6bits(byte)+1;value = ImageFile.ReadNextByte();for(i=1 to counter)DecompressedFile.WriteByte(value)}else {DecompressedFile.WriteByte(byte)} while(ImageFile.EOF());Задание2:Начертить блок-схему первого варианта алгоритма RLEБлок-схема енкодера4Блок-схема декодера5Пример 3: второй вариант алгоритма сжатия без потерь RLE:Второй вариант этого алгоритма имеет больший максимальный коэффициентархивации и меньше увеличивает в размерах исходный файл.
Признаком повтора в данномалгоритме является единица в старшем разряде соответствующего байта:Алгоритм декомпрессии для него выглядит так: считываем счетчик повторяемых илиоригинальных байт. Если первый бит счетчика установлен в 1, значит следующий байтследует повторить n раз, n={0;127}. Как извлечь младшие 7 разрядов из байта см. в описаниилабораторной работы 1 (побитовые логические операции). Если первый бит счетчикаустановлен в 0, значит следующие n байт (n={0;127}) следует записать по одному разу.Initialization(...);do {byte = ImageFile.ReadNextByte();counter = Low7bits(byte)+1;if(если признак повтора(byte)) {value = ImageFile.ReadNextByte();for (i=1 to counter)CompressedFile.WriteByte(value)}else {for(i=1 to counter){value = ImageFile.ReadNextByte();CompressedFile.WriteByte(value)}CompressedFile.WriteByte(byte)} while(ImageFile.EOF());Задание 3:Начертить блок-схемe для второго варианта алгоритм RLEБлок-схема енкодераБлок-схема декодераХарактеристики алгоритма RLE:Коэффициенты компрессии:первый вариант: 32, 2, 0,5; (лучший, средний, худший коэффициенты);6второй вариант: 64, 3, 128/129; (лучший, средний, худший коэффициенты).Класс изображений: ориентирован алгоритм на изображения с небольшим количеством цветов:деловую и научную графику.Симметричность: примерно единица.Характерные особенности: К положительным сторонам алгоритма, пожалуй, можно отнести только то,что он не требует дополнительной памяти при архивации и разархивации, а также быстро работает.
Интереснаяособенность группового кодирования состоит в том, что степень архивации для некоторых изображений можетбыть существенно повышена всего лишь за счет изменения порядка цветов в палитре изображения.Задание 4:1. Реализовать RLE encoder/decoder по первому алгоритму.2. Реализовать RLE encoder/decoder по второму алгоритму.Программа должна предоставлять пользователю возможность: загрузитьпроизвольный файл, сжать его согласно варианту задания, загрузить сжатый файл,декодировать сжатый файл.При сдаче лабораторной предоставить два файла, один из которых демонстрируетэффективность работы алгоритма, а второй – наоборот, показывает, увеличение объемасжатого файла по сравнению с исходным.Исходный кодТестовые данныеРезультат выполнения7Контрольные вопросы1.2.3.4.5.6.Операции чтения и записи с двоичными файлами?Первый вариант алгоритма сжатия RLE: енкодер?Первый вариант алгоритма сжатия RLE: декодер?Второй вариант алгоритма сжатия RLE: енкодер?Второй вариант алгоритма сжатия RLE: декодер?Характеристики алгоритма RLE?СПИСОК ЛИТЕРАТУРЫ1.
Ватолин Д. С. Алгоритмы сжатия изображений. Методическое пособие: М.:Издательский отдел факультета Вычислительной Математики и Кибернетики МГУим. М.В.Ломоносова, 1999 г. — 76 с.2. Ахо, Альфред, В., Хопкрофт, Джон, Ульман, Джеффри, Д. Структуры данных иалгоритмы. — Издательский дом «Вильямс», 2000. — С. 384.3.
Дейтел Х. М. Как программировать на С++: Пер. с англ. – М.: ЗАО «ИздательствоБИНОМ», 2000 г. – 1024 с.: ил.4. Страуструп Б. Язык программирования С++. Специальное издание: ++: Пер. с англ. –М.: ЗАО «Издательство БИНОМ», 2008 г. – 1104 с. :ил.5. Шилдт Г. Полный справочник по С++: ++: Пер. с англ. – М.: Изд-во Вильямс, 2007 г.– 800 с.: ил.6.
Шилдт Г. С++: Базовый курс: ++: Пер. с англ. – М.: Изд-во Вильямс, 2008 г. – 624 с.:ил.8датаОтчет по лабораторной работе №10«Основы C++, работа с сокетами. Часть1.»ОценкаБонус заподпись(max 5)сложностьЦели работы:Изучение принципов функционированияпрограммированием сокетов и потоков.сетевыхсоединений,ознакомлениесЗадачи работы:-ознакомление с понятием сетевого соединения и сокетов-разработка простейшего клиентаКраткий конспект теоретической части (ответы на контрольные вопросы)Понятие сокета___________ ________________________________________________________________________________________________________________________________________________________________________________________________________________________________________________________________________________________________________________________________________________________________________Типы сокетов_____________________________________________________________________________________________________________________________________________________________________________________________________________________________________________________________________________________________________________________________________________________________________________________Создание сокетов__________________________________________________________________________________________________________________________________________________________________________________________________________________________________________________________________________________________________________________________________________________________________________________Понятие IP адреса__________________________________________________________________________________________________________________________________________________________________________________________________________________________________________________________________________________________________________________________________________________________________________________Связывание сокета_________________________________________________________________________________________________________________________________________________________________________________________________________________________________________________________________________________________________________________________________________________________________________________Создание канала связи (клиент/сервер)__________________________________________________________________ _____________________________________________________________________________________________________________________________________________________________________________________________________________________________________________________________________________________________Передача данных _________________________________________________________________________________________________________________________________________________________________________________________________________________________________________________________________________________________________________________________________________________________________________________UDP-клиент?____________ _____________________________________________________1______________________ __________________________________________________________________________________________________________________________________________________________________________________________________________________________________________________________________________________________________________________________________________________________________________2Основы C++, работа с сокетами.
Часть1.Пример 1: Создание сокета:Инициализация библиотеки WinSock, содржащей функции работы с сокетами.int WSAStartup (WORD wVersionRequested, LPWSADATA lpWSAData);wVersionRequested версия библиотеки WinSock, необходимая для работы вашего приложения.lpWSAData - параметр, содержащий указатель на структуру типа WSADATA , в которую будут записанысведения о конкретной реализации интерфейса Windows Sockets.В случае успеха функция WSAStartup возвращает нулевое значение. Если происходит ошибка, возвращаетсяодно из следующих значений:ЗначениеОписаниеWSASYSNOTREADYСетевое программное обеспечение не готово дляработыWSAVERNOTSUPPORTEDФункция не поддерживается данной реализациейинтерфейса Windows SocketsWSAEINVALБиблиотека DLL, обеспечивающая интерфейсeWindows Sockets, не соответствуетверсии,указанной приложением указанной в параметреwVersionRequestedОсвобождение ресурсов, выделенных для работы с сокетами:int WSACleanup (void);Эта функция может возвратить нулевое значение при успехе или значение SOCKET_ERROR в случае ошибки.Получение кода последней ошибки: int WSAGetLastError (void);Создание сокета: SOCKET socket (int af, int type, int protocol);Af - формат адреса.
Для этого параметра вы должны указывать значение AF_INET , что соответствует форматуадреса, принятому в Internet.type - тип сокетаprotocol - протокол, который будет использован для данного сокета.Типы сокетов:Тип сокетаОписаниеSOCK_STREAMСокет будет использован для передачи данных через каналсвязи с использованием протокола TCPSOCK_DGRAMПередача данных будет выполняться без создания каналовсвязи через датаграммный протокол UDPRAWвозможность пользовательского доступа к низлежащимкоммуникационным протоколам, поддерживающим сокетабстракции. Такие сокеты обычно являются датаграмориентированными.Что же касается параметра protocol, то вы можете указать для него нулевое значение, в этом случаенеобходимый протокол будет определен по умолчанию, исходя из предыдущих параметров.В случае успеха функция socket возвращает дескриптор, который нужно использовать для выполнения всехопераций над данным сокетом. Если же произошла ошибка, эта функция возвращает значениеINVALID_SOCKETНиже представлен фрагмент кода, в котором создается сокет для передачи данных с использованием протоколаTCP:srv_socket = socket(AF_INET , SOCK_STREAM, 0);if(srv_socket == INVALID_SOCKET){3MessageBox(NULL, "socket Error", "Error", MB_OK);return;}Удаление сокета: int closesocket (SOCKET sock);#include <stdio.h>#include <iostream>#include <fstream>#include <string.h>#include <winsock2.h>#include <windows.h>using namespace std;#define PORT 777#define SERVERADDR "127.0.0.1"int main(int argc, char* argv[]){char buff[1024];printf("TCP DEMO CLIENT\n");// Шаг 1 - инициализация библиотеки Winsockif (WSAStartup(0x202,(WSADATA *)&buff[0])){printf("WSAStart error %d\n",WSAGetLastError());return -1;}SOCKET my_sock;my_sock=socket(AF_INET,SOCK_STREAM,0);if (my_sock<0){printf("Socket() error %d\n",WSAGetLastError());return -1;}closesocket(my_sock);WSACleanup();return -1;}Результат создания проектаПример 2:Привязка сокета с адресам:Для связывания сокета с адресом и номером порта используют системный вызов bind:int bind (SOCKET sock, const struct sockaddr FAR * addr, int namelen);4Параметр sock должен содержать дескриптор сокета, созданного функцией socket .В поле addr следует записать указатель на подготовленную структуру SOCKADDR , а в поле namelen - размерэтой структуры.В случае ошибки функция bind возвращает значение SOCKET_ERROR .