Легенда:
новое сообщение
закрытая нитка
новое сообщение
в закрытой нитке
старое сообщение
|
- Напоминаю, что масса вопросов по функционированию форума снимается после прочтения его описания.
- Новичкам также крайне полезно ознакомиться с данным документом.
| | | | | |
это был не мой вариант, а всего лишь моя редакция 23.12.03 11:27 Число просмотров: 2052
Автор: LLL <Алексей> Статус: Member Отредактировано 23.12.03 11:29 Количество правок: 1
|
мне бы самому хотелось итерировать цикл по исходным байтам, примерно так:
unsigned char
*src, /* source */
*dst, /* destination */
c, /* current byte */
p; /* (part of) previous byte */
int
si, /* source index */
di, /* dest. index */
bi; /* bit index */
for(p = bi = di = si = 0; si < 140; )
{
c = src[si++];
dst[di++] = p | ((c << bi) & 127);
p = (unsigned)c >> (7-bi++);
if(bi == 7)
dst[di++] = p,
p = bi = 0;
} ---
> Мой вариант далеко не оптимален по сравнению с вариантом > LLL, но работает исправно...
Здесь я улавливаю намек на то, что алгоритм Killer'а, слегка мной отредактированный, правильно не функционирует. Это на самом деле так?
...
while(pos2<140)
^^^
здесь наверно 160 должно быть?
или pos1 вместо pos2
---
|
<programming>
|
[C++] Распаковка текста из 7 битного представления в 8 битное... 21.12.03 01:29
Автор: CrazyPitbull Статус: Незарегистрированный пользователь
|
Есть текст запакованный 7 битами, нужно распокавать в обычное представление 8 битное, может, кто сталкивался, подскажите алгоритм... всё, что сам придумал слишком грамоздкое... Заранее спасибо
|
|
[C++] Я правильно понял о чем речь? (update) 21.12.03 01:34
Автор: Ktirf <Æ Rusakov> Статус: Elderman Отредактировано 21.12.03 01:38 Количество правок: 1
|
Двоичный код блоками по 7 бит нужно представить блоками по 8?
std::bitset не поможет решению?
Ну или в лоб, ручками битики переписывать... По-моему, не так уж громоздко выходит.
|
| |
[C++]несовсе, текст запакован, из 160 символов получаем 140 байт, ты так понял? 21.12.03 02:20
Автор: CrazyPitbull Статус: Незарегистрированный пользователь
|
Для сжатия текста в котором только латинские буквы применяется 7 битное представление буквы, т.е. для представления латинской буквы хватит 7 бит из байта, поэтому происходит кадировака по следующему принципу:
Первый байт записывается так:
старший бит берется из младшего бита 2-го байта, 7 остальных бит - биты первого символа.
Второй байт записывается так:
два старших бита берутся из младших разрядов 3-го байта, а шесть младших - из оставшихся битов второго символа и т.д.
Теперь необходимо обратно распокавать, самое простое это убрать по 7 бит и пихать в байт, далее следующие 7 бит и т.д. нет ли какого более быстрого алгоритма?
|
| | |
[C++] А, ну об этом я и подумал. 21.12.03 13:36
Автор: Ktirf <Æ Rusakov> Статус: Elderman
|
> Теперь необходимо обратно распокавать, самое простое это > убрать по 7 бит и пихать в байт, далее следующие 7 бит и > т.д. нет ли какого более быстрого алгоритма? Нет, более быстрого, чем то, что нарисовал Killer, пожалуй, найти нельзя. Ну то есть скажем так, есть std::bitset, в который можно сначала все 7-битники загрузить, а потом прочитать из него же по 8 бит. Выглядеть это будет нагляднее, но работать будет медленнее (кажется). Сорри, что кода не привожу, справочной литературы под рукой нет.
|
| | |
чтото типа такого?.. 21.12.03 04:39
Автор: Killer{R} <Dmitry> Статус: Elderman
|
на эффективность не претендую, но мот будет работать - если что поправте...
unsigned chat *src;
unsigned chat *dst;
....
int n=0;
for(int i=0;i<160*7;i+=7)
{
int j=i/8;
int k=i%8;
int x=src[i];
if(k)
{
x=x>>k;
if(k>1)
{
int x2=src[i+1];
x2=x2<<(8-k);
x=x|x2;
}
}
x=x&127;
dst[n]=(unsigned char)x;
n++;
}
|
| | | |
корректировка 22.12.03 16:32
Автор: LLL <Алексей> Статус: Member Отредактировано 22.12.03 18:03 Количество правок: 1
|
> на эффективность не претендую, но мот будет работать - если > что поправте...
выглядит правильным, только у src индексом должно быть j, а не i, да и по сишному я бы это переписал так:
unsigned char *src;
unsigned char *dst;
....
int n=0;
for(int i=0;i<160*7;i+=7)
{
int j, k, x=src[j = i >> 3];
if((k=i&7))
{
x=x>>k;
if(k>1)
x|=src[j+1] << (8-k);
}
dst[n++]=(unsigned char)(x&127);
}
---
|
| | | | |
Мой код.. 23.12.03 04:07
Автор: CrazyPitbull Статус: Незарегистрированный пользователь
|
Мой вариант далеко не оптимален по сравнению с вариантом LLL, но работает исправно...
unsigned char *source;
unsigned char *dest;
int st2 = 6;
int bit = 0;
int pos1 = 0;
int pos2 = 0;
unsigned char bt = 0;
dest[0] = 0;
while(pos2< 140){
if(bit == 7){
st2 = 6;
bit = 0;
pos2++;
dest[pos2] = 0;
}
bt = (int)(source[pos1])%(2<<st2--);
dest[pos2++] += (int)bt << bit;
bit++;
dest[pos2] = source[pos1++] >> 8-bit;
}
P.S: Спасибо всем, кто откликнулся!
|
| | | | | |
это был не мой вариант, а всего лишь моя редакция 23.12.03 11:27
Автор: LLL <Алексей> Статус: Member Отредактировано 23.12.03 11:29 Количество правок: 1
|
мне бы самому хотелось итерировать цикл по исходным байтам, примерно так:
unsigned char
*src, /* source */
*dst, /* destination */
c, /* current byte */
p; /* (part of) previous byte */
int
si, /* source index */
di, /* dest. index */
bi; /* bit index */
for(p = bi = di = si = 0; si < 140; )
{
c = src[si++];
dst[di++] = p | ((c << bi) & 127);
p = (unsigned)c >> (7-bi++);
if(bi == 7)
dst[di++] = p,
p = bi = 0;
} ---
> Мой вариант далеко не оптимален по сравнению с вариантом > LLL, но работает исправно...
Здесь я улавливаю намек на то, что алгоритм Killer'а, слегка мной отредактированный, правильно не функционирует. Это на самом деле так?
...
while(pos2<140)
^^^
здесь наверно 160 должно быть?
или pos1 вместо pos2
---
|
| | | | | | |
Это ты прав, опечантка... Савмо сабой нужно 160 23.12.03 17:54
Автор: CrazyPitbull Статус: Незарегистрированный пользователь
|
> while(pos2<140) > ^^^ > здесь наверно 160 должно быть? > или pos1 вместо pos2 >
Это ты прав, опечантка... Савмо сабой нужно 160
|
| | | | |
Угу очепятался
22.12.03 20:32
Автор: Killer{R} <Dmitry> Статус: Elderman
|
> выглядит правильным, только у src индексом должно быть j, Угу очепятался
> не i, да и по сишному я бы это переписал так: Дык я чтоб нагляднее было постарался )
|
| | | | | |
для наглядности было б еще полезно применить и исходник с отступами сделать :-) 22.12.03 21:08
Автор: LLL <Алексей> Статус: Member
|
|
| | | | | | |
А что с потерей некоторых символов? 24.12.03 12:13
Автор: DgtlScrm Статус: Member Отредактировано 24.12.03 12:13 Количество правок: 1
|
|
| | | | | | | |
каких символов? где? 25.12.03 09:56
Автор: LLL <Алексей> Статус: Member
|
|
| | | | | | | | |
упс...,я неправильно понял тему... все нормально.. 26.12.03 09:47
Автор: DgtlScrm Статус: Member
|
|
|
|