Реклама на сайте DatasheetsDatasheets

KAZUS.RUN - Электронный портал. Принципиальные схемы, Datasheets, Форум по электронике

Новости электроники Новости Литература, электронные книги Литература Документация, даташиты Документация Поиск даташитов (datasheets)Поиск PDF
  От производителей
Новости поставщиков
В мире электроники

  Сборник статей
Книги и журналы
FAQ по электронике

  Datasheets
Поиск SMD
Онлайн справочник

Принципиальные схемы Схемы Каталоги программ, сайтов Каталоги Общение, форум Общение Ваш аккаунтАккаунт
  Каталог схем
Схемы и проекты
Принципиальные схемы
  Программы
Каталог сайтов
Калькуляторы
  Форумы по электронике
Помощь проекту

Proteus, KiCAD и другие ECAD Разработчик так или иначе сталкивается с системами автоматизированного проектирования. Данный раздел - по САПР.

 
Опции темы

Упаковка данных (сжатие данных)

Непрочитано 05.09.2007, 14:10  
satnettv
Прохожий
 
Регистрация: 30.08.2007
Сообщений: 6
Сказал спасибо: 0
Сказали Спасибо 0 раз(а) в 0 сообщении(ях)
satnettv на пути к лучшему
По умолчанию Упаковка данных (сжатие данных)

Задача в следующем:

требуется простой пример упаковки (сжатия) данных на каком-нибудь примере, написанном на Си. Пишу на code vision, с ассемблером не в ладах.

Упаковка данных (сжатие данных)
satnettv вне форума  
Непрочитано 05.09.2007, 14:59  
Hoksmur
Частый гость
 
Регистрация: 16.05.2005
Сообщений: 20
Сказал спасибо: 0
Сказали Спасибо 0 раз(а) в 0 сообщении(ях)
Hoksmur на пути к лучшему
По умолчанию

примерами не помогу, а "на пальцах" это так: берём последовательность байт, проверяем - если идут два или больше подряд одинаковых - пишем 2 байта (одинаковых, за ними счетчик, указывающий, сколько их было. Мне помогло.
Hoksmur вне форума  
Непрочитано 05.09.2007, 15:49  
satnettv
Прохожий
 
Регистрация: 30.08.2007
Сообщений: 6
Сказал спасибо: 0
Сказали Спасибо 0 раз(а) в 0 сообщении(ях)
satnettv на пути к лучшему
По умолчанию

Сообщение от Hoksmur
примерами не помогу, а "на пальцах" это так: берём последовательность байт, проверяем - если идут два или больше подряд одинаковых - пишем 2 байта (одинаковых, за ними счетчик, указывающий, сколько их было. Мне помогло.

а по подробнее...
satnettv вне форума  
Непрочитано 06.09.2007, 19:12  
Hoksmur
Частый гость
 
Регистрация: 16.05.2005
Сообщений: 20
Сказал спасибо: 0
Сказали Спасибо 0 раз(а) в 0 сообщении(ях)
Hoksmur на пути к лучшему
По умолчанию

Блин.. Вот под ТС3 сжатие. берем байт, сравниваем с предыдущим - если не равен - пишем его. Если равен - берем следующий, и так далее, пока одинаковые не кончатся. как кончились - пишем два одинаковых байта, за ними счётчик, сколько же их было. При распаковке если два одинаковых - знаем, что за ними счетчик, их восстанавливаем. Эффективно в случае, когда много последовательностей повторющихся байтов. Растровая графика, к примеру.
Код:
#include ‹stdio.h›
#include ‹fcntl.h›
#include ‹io.h›
// #include ‹sysstat.h›
// #include ‹sys	ypes.h›
#include ‹string.h›

//void function printl(unsigned char);

void printl( unsigned char *let)
//unsigned char *let;
{
  	if (((let›34) && (let‹128))||let==32)
	   printf("%c", let);
	else
	   printf("x%X", let);
	   //printf(".");
}

void main(int argc, char *argv[])
{
FILE *mfile;
unsigned int cnt =1;
unsigned char *ch;
unsigned char *prev;

   if (argc != 2)      // test number of arguments
   {
      printf("  Convert binary file to C string (compress)
");
      printf("  use: myfile.exe file.bin
");
      exit(-1);
   }
   printf ( "  -=%s=-
", argv[argc-1]);

   mfile = fopen( argv[argc-1], "r+b");
   while ( (ch=fgetc(mfile)) != EOF )
   {
	if (prev==ch)
	    {
	    do
	       {
		  cnt++;
		  //prev=ch;
		  ch=fgetc(mfile);
	       }
	    while (prev==ch);
		// print here
		printl(prev);
		printf ("x%X
", cnt);
		prev=ch;
	    printl(ch);
	    cnt=1;
	    }
	else
	 {
	  prev=ch;
	  // print here
	  printl(ch);
	 }
   }
   fclose (mfile);

}
Распаковка примерно так
Код:
#include ‹stdio.h›
#include ‹fcntl.h›
#include ‹io.h›
// #include ‹sysstat.h›
// #include ‹sys	ypes.h›
#include ‹string.h›

void printl(unsigned char let)
{
//unsigned char let;
 if ( (let›)&&(let‹128) )
  printf("%c", let);
 else
  printf("#", let);
}

void main(int argc, char *argv[])
{
const char oc220[] = {
"" // Здесь массив байт
};

unsigned int cnt   = 0;
unsigned int shft ;
unsigned char ch0;
unsigned char ch1;
unsigned char ch2;

 shft=cnt;
 do
   {
    ch0=oc220[shft];
    ch1=oc220[shft+1];
    ch2=oc220[shft+2];
    if (ch0==ch1)
      {
       //printf("%3u: ", cnt); printl(ch0);
       //printf(" ["); printl(ch1); printf("]["); printl(ch2); printf("]
");
       printf("*");
       do
	{
	 printf (".");
	 cnt++;
	}
       while ( 1 ‹ --ch2 );
	//printf("
");
       shft++; shft++;
      }
    else
     {
      //printf("%3u: ", cnt); printl(ch0); printf("
");
      printl(ch0);
     }
    shft++;
   }
 while (++cnt‹512);

}
Еще могу посоветовать в библиотеке порыться -кажется "Радиолюбитель. Ваш компьютер" в 90-х годах был нормальный алгоритм с примером на паскале. Если ничего не напутал. Ну и интернет.
Hoksmur вне форума  
Непрочитано 06.09.2007, 20:15  
Hoksmur
Частый гость
 
Регистрация: 16.05.2005
Сообщений: 20
Сказал спасибо: 0
Сказали Спасибо 0 раз(а) в 0 сообщении(ях)
Hoksmur на пути к лучшему
По умолчанию

Посоветую еще в гугле том же набрать "алгоритмы сжатия" и почитать про RLE(я почти его привёл) и LZW.
Если у кого есть реализация на С/asm под контроллеры LZW (именно распаковки из памяти программ больше интересно; и подготовки данных для него, да хоть на персоналке ) Поделитесь, или киньте линк, подалуйста.
Hoksmur вне форума  
 
Опции темы

Ваши права в разделе
Вы не можете создавать новые темы
Вы не можете отвечать в темах
Вы не можете прикреплять вложения
Вы не можете редактировать свои сообщения

BB коды Вкл.
Смайлы Вкл.
[IMG] код Вкл.
HTML код Выкл.

Быстрый переход

Похожие темы
Тема Автор Раздел Ответов Последнее сообщение
Протокол передачи данных CAN VladG Автоматика и аппаратура связи 5 09.09.2009 03:04
Преобразование данных Chemst Делимся опытом 0 08.10.2008 10:38
Передача данных по электропроводке Beduin Автоматика и аппаратура связи 9 30.08.2007 04:03
Передача данных LSergM Автоматика и аппаратура связи 4 16.08.2007 08:11
Передача данных GPRS Andrewg Автоматика и аппаратура связи 3 14.08.2007 15:49


Часовой пояс GMT +4, время: 18:50.


Powered by vBulletin® Version 3.8.4
Copyright ©2000 - 2026, Jelsoft Enterprises Ltd.