информационная безопасность
без паники и всерьез
 подробно о проектеRambler's Top100
Сетевые кракеры и правда о деле ЛевинаЗа кого нас держат?Атака на Internet
BugTraq.Ru
Русский BugTraq
 Анализ криптографических сетевых... 
 Модель надежности двухузлового... 
 Специальные марковские модели надежности... 
 Бэкдор в xz/liblzma, предназначенный... 
 Три миллиона электронных замков... 
 Doom на газонокосилках 
главная обзор RSN блог библиотека закон бред форум dnet о проекте
bugtraq.ru / форум / programming
Имя Пароль
ФОРУМ
если вы видите этот текст, отключите в настройках форума использование JavaScript
регистрация





Легенда:
  новое сообщение
  закрытая нитка
  новое сообщение
  в закрытой нитке
  старое сообщение
  • Напоминаю, что масса вопросов по функционированию форума снимается после прочтения его описания.
  • Новичкам также крайне полезно ознакомиться с данным документом.
для наглядности было б еще полезно применить и исходник с отступами сделать :-) 22.12.03 21:08  Число просмотров: 1989
Автор: LLL <Алексей> Статус: Member
<"чистая" ссылка>
<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
<"чистая" ссылка>
1




Rambler's Top100
Рейтинг@Mail.ru


  Copyright © 2001-2024 Dmitry Leonov   Page build time: 0 s   Design: Vadim Derkach