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

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

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

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

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

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

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
Сообщений: 21
Сказал спасибо: 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
Сообщений: 21
Сказал спасибо: 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
Сообщений: 21
Сказал спасибо: 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, время: 21:29.


Powered by vBulletin® Version 3.8.4
Copyright ©2000 - 2024, Jelsoft Enterprises Ltd. Перевод: zCarot