Proteus, KiCAD и другие ECAD Разработчик так или иначе сталкивается с системами автоматизированного проектирования. Данный раздел - по САПР. |
05.09.2007, 14:10
|
|
Прохожий
Регистрация: 30.08.2007
Сообщений: 6
Сказал спасибо: 0
Сказали Спасибо 0 раз(а) в 0 сообщении(ях)
|
Упаковка данных (сжатие данных)
Задача в следующем:
требуется простой пример упаковки (сжатия) данных на каком-нибудь примере, написанном на Си. Пишу на code vision, с ассемблером не в ладах.
Упаковка данных (сжатие данных)
|
|
|
|
05.09.2007, 14:59
|
|
Частый гость
Регистрация: 16.05.2005
Сообщений: 21
Сказал спасибо: 0
Сказали Спасибо 0 раз(а) в 0 сообщении(ях)
|
примерами не помогу, а "на пальцах" это так: берём последовательность байт, проверяем - если идут два или больше подряд одинаковых - пишем 2 байта (одинаковых, за ними счетчик, указывающий, сколько их было. Мне помогло.
|
|
|
|
05.09.2007, 15:49
|
|
Прохожий
Регистрация: 30.08.2007
Сообщений: 6
Сказал спасибо: 0
Сказали Спасибо 0 раз(а) в 0 сообщении(ях)
|
Сообщение от Hoksmur
|
примерами не помогу, а "на пальцах" это так: берём последовательность байт, проверяем - если идут два или больше подряд одинаковых - пишем 2 байта (одинаковых, за ними счетчик, указывающий, сколько их было. Мне помогло.
|
а по подробнее...
|
|
|
|
06.09.2007, 19:12
|
|
Частый гость
Регистрация: 16.05.2005
Сообщений: 21
Сказал спасибо: 0
Сказали Спасибо 0 раз(а) в 0 сообщении(ях)
|
Блин.. Вот под ТС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-х годах был нормальный алгоритм с примером на паскале. Если ничего не напутал. Ну и интернет.
|
|
|
|
06.09.2007, 20:15
|
|
Частый гость
Регистрация: 16.05.2005
Сообщений: 21
Сказал спасибо: 0
Сказали Спасибо 0 раз(а) в 0 сообщении(ях)
|
Посоветую еще в гугле том же набрать "алгоритмы сжатия" и почитать про RLE(я почти его привёл) и LZW.
Если у кого есть реализация на С/asm под контроллеры LZW (именно распаковки из памяти программ больше интересно; и подготовки данных для него, да хоть на персоналке ) Поделитесь, или киньте линк, подалуйста.
|
|
|
|
Ваши права в разделе
|
Вы не можете создавать новые темы
Вы не можете отвечать в темах
Вы не можете прикреплять вложения
Вы не можете редактировать свои сообщения
HTML код Выкл.
|
|
|
Часовой пояс GMT +4, время: 23:10.
|
|