![]() |
|
|
Регистрация Восстановить пароль |
Регистрация | Задать вопрос |
Заплачу за решение |
Новые сообщения |
Сообщения за день |
Расширенный поиск |
Правила |
Всё прочитано |
![]() |
|
|
Опции темы | Поиск в этой теме |
![]() |
#11 |
Участник клуба
Регистрация: 26.10.2007
Сообщений: 1,244
|
![]()
Вообщем суть проста:
1. В двумерный массив заносим все комбинации двузначного числа + пробел. Это в первый столбец. Во второй столбец одиночный символ. Как несложно подсчитать все возможные комбинации двузначного числа составят 11 * 11 = 121. И как раз однозначных символов у нас немного больше... по моим грубым подсчётам 140 - 150.... 2. Берём из строки по два символа и ищем в первом столбце. Как только нашли, добавляем в текстполе одиночный символ из второго столбца. Ну вот и получается 2:1. Еслиже строка нечётна то последний символ тупо припллюсовываем.
Умом Россию не понять, пока не выпито ноль пять,
А если выпито ноль пять всё делом кажется не хитрым, Попытка глубже понимать уже попахивает литром... |
![]() |
![]() |
![]() |
#12 |
Александр
Администратор
Регистрация: 28.10.2006
Сообщений: 17,630
|
![]()
метод Фано
Отличается чрезвычайной простотой конструкции и заключается в следующем - упорядоченный в порядке убывания вероятностей список букв делится на две последовательные части так, чтобы суммы вероятностей входящих в них букв как можно меньше отличались друг от друга. Всем буквам из первой части приписывается символ 0, а буквам из второй символ 1. Далее также поступаем с каждой из полученных двух частей, если они содержат по крайней мере две буквы. Продолжать до тех пор, пока весь список не разобьется на части содержащие по 1 букве. Каждой букве ставится последовательность символов приписанных в результате данного процесса букве (в вашем случае битов, например) В результате, самые встречающиеся буквы будут иметь наименьшую длину в битах. На форуме есть курсовик на эту тему от zetrix. |
![]() |
![]() |
![]() |
#13 | |
Александр
Администратор
Регистрация: 28.10.2006
Сообщений: 17,630
|
![]()
Пример из сети
Цитата:
|
|
![]() |
![]() |
![]() |
#14 |
-=PriZraK=-
Форумчанин
Регистрация: 12.12.2007
Сообщений: 399
|
![]()
СПАСИБО ВСЕМ КТО ПОПЫТАЛСЯ ПОМОЧЬ!!!! Я РЕШИЛ ПРОБЛЕМУ ИСПОЛЬЗОВАВ МЕТОД СЖАТИЯ BASE91. Очень неплохая система сжатия данных(особенно двоичных). И со строками тож не плохо справляется, но недостаток системы сжатия в том, что при обработке файлов малого объёма, программа лишь увеличивает объём :D так например файл ~10Kb после сжатия будет ~12kb. А вот простой файл Flash(*.swf) 2,43Mb после сжатия ~1,4mb. Всё же хоть,что-то)
|
![]() |
![]() |
![]() |
#15 |
Александр
Администратор
Регистрация: 28.10.2006
Сообщений: 17,630
|
![]()
prizrak1390, можно привести в пример делфи код? в этой теме.
|
![]() |
![]() |
![]() |
#16 |
-=PriZraK=-
Форумчанин
Регистрация: 12.12.2007
Сообщений: 399
|
![]()
Вот листинг главной форму Base91
unit MainForm; interface uses Windows, Messages, SysUtils, Variants, Classes, Graphics, Controls, Forms, Dialogs, StdCtrls; type TForm1 = class(TForm) ButtonEncode: TButton; ButtonDecode: TButton; OpenDialog1: TOpenDialog; SaveDialog1: TSaveDialog; InputFileName: TEdit; OutputFileName: TEdit; ButtonExit: TButton; Label1: TLabel; Label2: TLabel; ButtonSelectInputFile: TButton; ButtonSelectOutputFile: TButton; Label3: TLabel; procedure ButtonSelectInputFileClick(Sender: TObject); procedure ButtonSelectOutputFileClick(Sender: TObject); procedure ButtonDecodeEncodeClick(Sender: TObject); procedure ButtonExitClick(Sender: TObject); private public end; var Form1: TForm1; implementation {$R *.dfm} uses basE91; procedure TForm1.ButtonDecodeEncodeClick(Send er: TObject); var basE91: TBasE91; fin, fout: TFileStream; Buf: array[0..1024] of byte; c: integer; written: integer; begin written := 0; fin := TFileStream.Create(InputFileName.Te xt, fmOpenRead); fout := TFileStream.Create(OutputFileName.T ext, fmCreate); if (TComponent(Sender).Name = 'ButtonEncode') then base91 := TBase91Encoder.Create(fout); if (TComponent(Sender).Name = 'ButtonDecode') then base91 := TBase91Decoder.Create(fout); if not assigned(basE91) then begin Beep; exit; end; while ((fin.Position + SizeOf(Buf)) < fin.Size) do begin fin.Read(Buf, SizeOf(Buf)); c := base91.Update(@Buf, 0, SizeOf(Buf)); Inc(written, c); end; c := fin.Size - fin.Position; fin.Read(Buf, c); c := base91.Update(@Buf, 0, c); Inc(written, c); c := base91.Finalize(); Inc(written, c); base91.Free; fin.Free; fout.Free; ShowMessageFmt('Total bytes written: %d', [written]); end; procedure TForm1.ButtonExitClick(Sender: TObject); begin Application.Terminate; end; procedure TForm1.ButtonSelectInputFileClick(S ender: TObject); begin OpenDialog1.FileName := InputFileName.Text; if (OpenDialog1.Execute) then InputFileName.Text := OpenDialog1.FileName; end; procedure TForm1.ButtonSelectOutputFileClick( Sender: TObject); begin SaveDialog1.FileName := OutputFileName.Text; if (SaveDialog1.Execute) then OutputFileName.Text := SaveDialog1.FileName; end; end. |
![]() |
![]() |
![]() |
#17 |
-=PriZraK=-
Форумчанин
Регистрация: 12.12.2007
Сообщений: 399
|
![]()
А это листинг самого модуля Base91
unit basE91; interface uses SysUtils, Windows, Classes; type // Abstract base class for encoding or decoding TBasE91 = class protected FOutputStream: TStream; public constructor Create(OutputStream: TStream); // Returns the number of bytes written to OutputStream function Update(InputData: PByte; Offset: integer; Length: integer): integer; virtual; abstract; // Returns the number of bytes written to OutputStream function Finalize(): integer; virtual; abstract; procedure reset(); virtual; abstract; end; TBasE91Encoder = class(TBasE91) private ebq, en: integer; protected public function Update(InputData: PByte; Offset: integer; Length: integer): integer; override; function Finalize(): integer; override; procedure reset(); override; end; TBasE91Decoder = class(TBasE91) private dbq, dn, dv: integer; protected public function Update(InputData: PByte; Offset: integer; Length: integer): integer; override; function Finalize(): integer; override; procedure reset(); override; end; implementation const EncodingTable: array[0..90] of byte = ( Ord('A'), Ord('B'), Ord('C'), Ord('D'), Ord('E'), Ord('F'), Ord('G'), Ord('H'), Ord('I'), Ord('J'), Ord('K'), Ord('L'), Ord('M'), Ord('N'), Ord('O'), Ord('P'), Ord('Q'), Ord('R'), Ord('S'), Ord('T'), Ord('U'), Ord('V'), Ord('W'), Ord('X'), Ord('Y'), Ord('Z'), Ord('a'), Ord('b'), Ord('c'), Ord('d'), Ord('e'), Ord('f'), Ord('g'), Ord('h'), Ord('i'), Ord('j'), Ord('k'), Ord('l'), Ord('m'), Ord('n'), Ord('o'), Ord('p'), Ord('q'), Ord('r'), Ord('s'), Ord('t'), Ord('u'), Ord('v'), Ord('w'), Ord('x'), Ord('y'), Ord('z'), Ord('0'), Ord('1'), Ord('2'), Ord('3'), Ord('4'), Ord('5'), Ord('6'), Ord('7'), Ord('8'), Ord('9'), Ord('!'), Ord('#'), Ord('$'), Ord('%'), Ord('&'), Ord('('), Ord(')'), Ord('*'), Ord('+'), Ord(','), Ord('.'), Ord('/'), Ord(':'), Ord(';'), Ord('<'), Ord('='), Ord('>'), Ord('?'), Ord('@'), Ord('['), Ord(']'), Ord('^'), Ord('_'), Ord('`'), Ord('{'), Ord('|'), Ord('}'), Ord('~'), Ord('"')); var DecodingTable: array[0..255] of byte; constructor TBasE91.Create(OutputStream: TStream); begin FOutputStream := OutputStream; Reset(); end; procedure TBasE91Encoder.Reset(); begin ebq := 0; en := 0; end; function TBasE91Encoder.Update(InputData: PByte; Offset: integer; Length: integer): integer; var WriteBuf: array[0..1] of byte; i, ev: integer; begin Result := 0; Inc(InputData, Offset); for i := 1 to Length do begin ebq := ebq or ((InputData^) shl en); Inc(InputData); Inc(en, 8); if (en > 13) then begin ev := ebq and 8191; if (ev > 88) then begin ebq := ebq shr 13; Dec(en, 13); end else begin ev := ebq and 16383; ebq := ebq shr 14; Dec(en, 14); end; WriteBuf[0] := EncodingTable[ev mod 91]; WriteBuf[1] := EncodingTable[ev div 91]; FOutputStream.Write(WriteBuf, 2); Inc(Result, 2); end; end; end; function TBasE91Encoder.Finalize(): integer; begin Result := 0; if (en > 0) then begin FOutPutStream.Write(EncodingTable[ebq mod 91], 1); Inc(Result); if ((en > 7) or (ebq > 90)) then begin FOutPutStream.Write(EncodingTable[ebq div 91], 1); Inc(Result); end; end; Reset(); end; procedure TBasE91Decoder.Reset(); begin dbq := 0; dn := 0; dv := -1; end; function TBasE91Decoder.Update(InputData: PByte; Offset: integer; Length: integer): integer; var i: integer; inputByte: byte; begin Result := 0; Inc(InputData, Offset); for i := 1 to Length do begin inputByte := InputData^; Inc(InputData); if (DecodingTable[inputByte] = byte(-1)) then Continue; if (dv = -1) then dv := DecodingTable[inputByte] else begin Inc(dv, DecodingTable[InputByte] * 91); dbq := dbq or (dv shl dn); if ((dv and 8191) > 88) then Inc(dn, 13) else Inc(dn, 14); repeat FOutputStream.Write(byte(dbq), 1); Inc(Result); dbq := dbq shr 8; Dec(dn, 8); until (dn <= 7); dv := -1; end; end; end; function TBasE91Decoder.Finalize(): integer; var OutputByte: byte; begin Result := 0; if (dv <> -1) then begin OutputByte := dbq or dv shl dn; FOutputStream.Write(OutputByte, 1); end; Reset(); end; procedure PrepareDecodingTable(); var i: integer; begin for i := 0 to 255 do DecodingTable[i] := byte(-1); for i := 0 to 90 do DecodingTable[EncodingTable[i]] := i; end; begin PrepareDecodingTable(); end. |
![]() |
![]() |
![]() |
|
![]() |
||||
Тема | Автор | Раздел | Ответов | Последнее сообщение |
Изменение размера - Сжатие BMP в TImage | Air | Помощь студентам | 2 | 02.03.2008 17:00 |
Excel max 256 строк VS user надо 300 строк | Exo | Microsoft Office Excel | 3 | 10.01.2008 17:14 |
Сжатие битмапа | Rapid | Мультимедиа в Delphi | 7 | 08.12.2007 16:38 |
Проверка на сжатие | vitalik007 | Общие вопросы Delphi | 3 | 20.08.2007 10:53 |