Легенда:
   новое сообщение
    закрытая нитка
    новое сообщение
    в закрытой нитке
    старое сообщение
         
		 | 
- Напоминаю, что масса вопросов по функционированию форума снимается после прочтения его описания.
 - Новичкам также крайне полезно ознакомиться с данным документом.
   
[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
 | 
 
| 
 | 
 
 
  
 
 | 
 |