Добавил:
Опубликованный материал нарушает ваши авторские права? Сообщите нам.
Вуз: Предмет: Файл:
Скачиваний:
19
Добавлен:
02.05.2014
Размер:
3.38 Кб
Скачать
#include"math.h"

#include"Scr.h"

CScr::CScr(void)
{
   i1 = 3;
   i2 = 5;
   Cnt = 0;
   ProcPcn = 0;
	ScrBuff = NULL;
   PB = NULL;
   Memo = NULL;
}

void CScr::DeleteBuff(void)
{
   DWORD ci;
   if(ScrBuff)
   {
   	for(ci = 0; ci < Cnt; ci++)
			if(ScrBuff[ci].Buff) delete []ScrBuff[ci].Buff;
   	delete []ScrBuff;
   }
}

BYTE CScr::GetBit(BYTE byValue, BYTE Digit)
{
	if(byValue & (BYTE)pow(2, Digit)) return 1; else return 0;
}

void CScr::ScrStrim(TMemo *Strs, DWORD Count)
{
   DeleteBuff();
   Cnt = Count;
   AnsiString gh;
   BYTE gch, gchr, *B = new BYTE[i2], cm = 0, cn = 0, cl = 0;
   DWORD ci, cj, ck;
   BYTE F = 1;
   ScrBuff = new stScrBuff[Count];

   for(ci = 0; ci < Count; ci++)
   {
      ProcPcn = ci*20/Count;
      if(PB) PB->Position = ProcPcn;
      gh = Strs->Lines->Strings[ci];
      ScrBuff[ci].Buff = new BYTE[gh.Length()];
      ScrBuff[ci].Length = gh.Length();
      for(cj = 0; cj < gh.Length(); cj++)
      {
         gch = (BYTE)gh[cj+1];
         gchr = 0;
         for(ck = 0; ck < 8; ck++)
         {
            if(F >= 1 && F <= i1)
            	B[cm] = GetBit(gch, 7-ck);
            if(F >= i1+1 && F <= i2)
            	B[cm] = GetBit(gch, 7-ck)^B[cn];
            if(F > i2)
            	B[cm] = GetBit(gch, 7-ck)^B[cn]^B[cl];
            	gchr |= B[cm]<<(7-ck);
            if(F < i2+1) F++; else F = i2+1;
            if(cm < i2-1) cm++; else cm = 0;
            if(cm == i1) cn = 0; else cn++;
            if(cn == i2-i1) cl = 0; else cl++;
         }
         ScrBuff[ci].Buff[cj] = gchr;
      }
   }
   delete []B;
   if(Memo) Memo->Clear();

   for(ci = 0; ci < Count; ci++)
   {
      ProcPcn = 20+ci*80/Count;
      if(PB) PB->Position = ProcPcn;
      gh.SetLength(ScrBuff[ci].Length);
      for(cj = 1; cj <= ScrBuff[ci].Length; cj++)
   		gh[cj] = ScrBuff[ci].Buff[cj-1];
      Strs->Lines->Add(gh);
   }
   if(PB) PB->Position = 0;
}

void CScr::DeScrStrim(TMemo *Strs, DWORD Count)
{
   AnsiString gh;
   BYTE gch, gchr, *B = new BYTE[i2], *C = new BYTE[i2], cm = 0, cn = 0, cl = 0;
   DWORD ci, cj, ck;
   BYTE F = 1;
   Memo->Clear();
   for(ci = 0; ci < Cnt; ci++)
   {
      ProcPcn = ci*100/Count;
      if(PB) PB->Position = ProcPcn;
      gh.SetLength(ScrBuff[ci].Length);
      for(cj = 0; cj < ScrBuff[ci].Length; cj++)
      {
         gch = ScrBuff[ci].Buff[cj];
         gchr = 0;
         for(ck = 0; ck < 8; ck++)
         {
            if(F >= 1 && F <= i1)
            {
            	C[cm] = GetBit(gch, 7-ck);
               B[cm] = GetBit(gch, 7-ck);
            }
            if(F >= i1+1 && F <= i2)
            {
            	C[cm] = GetBit(gch, 7-ck)^B[cn];
               B[cm] = GetBit(gch, 7-ck);
            }
            if(F > i2)
            {
            	C[cm] = GetBit(gch, 7-ck)^B[cn]^B[cl];
               B[cm] = GetBit(gch, 7-ck);
            }
            gchr |= C[cm]<<(7-ck);
            if(F < i2+1) F++; else F = i2+1;
            if(cm < i2-1) cm++; else cm = 0;
            if(cm == i1) cn = 0; else cn++;
            if(cn == i2-i1) cl = 0; else cl++;
         }
         gh[cj+1] = (char)gchr;
      }
      Strs->Lines->Add(gh);
   }
   if(PB) PB->Position = 0;
   delete []B;
   delete []C;
}

CScr::~CScr(void)
{
	DeleteBuff();
}
Соседние файлы в папке Source