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





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




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


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