亚洲欧美第一页_禁久久精品乱码_粉嫩av一区二区三区免费野_久草精品视频

? 歡迎來到蟲蟲下載站! | ?? 資源下載 ?? 資源專輯 ?? 關于我們
? 蟲蟲下載站

?? lzw.pas

?? LZW和LZRW壓縮算法源代碼
?? PAS
字號:
unit Lzw;

interface

uses
  Windows, SysUtils, Classes;

const
  NOCODE = -1; // 空編碼
  LZWBITS = 8; // 字對處理位
  LZWBUFFER = $FFFF; // 編碼處理緩存容量(輸入緩存容量。經實踐,該值能達到較好的效率)
  LZWMAXBITS = 12; // 最大的編碼位(增加該值會增加編碼表的內存空間)
  LZWSTACKBUFFERSIZE = $FFFF; // 棧緩存容量(要保證它足夠大)
  LZWEXPORTBLOCKSIZE = $FFFF; // 輸出緩存容量
  LZWMAXCODES = 1 shl LZWMAXBITS; // 最大編碼(4096)
  LZWTABLESIZE = 1 shl (LZWBITS + LZWMAXBITS); // 編碼表容量(2MB空間)

type
  TLZWEncode = class(TObject)
  private
    EncodeTable: array [0..LZWTABLESIZE - 1] of Word; // 編碼表
    EncodePointer: array [0..LZWMAXCODES - 1] of LongWord; // 經過編碼的緩存
    ExportBlock: Pointer; // 存放編碼后的數據指針(輸出緩存塊指針)
    ExportBlockPtr: array of Byte; // 該指針指向 ExportBlock ,用于訪問數組
    InitBits: Integer; // 壓縮數據的起始位數
    ClearCode: Integer; // 清除碼
    EofCode: Integer; // 結束碼
    PrefixCode: Integer; // 字頭碼
    SuffixCode: Integer; // 字尾碼
    Encode: Integer; // 壓縮編碼
    RunBits: Integer; // 當前處理位
    MaxCodeSize: Integer; // 當前處理最大編碼
    FBegin: Boolean; // 開始處理標志
    FExportSize: Integer; // 輸出數據塊大小
    FExportIndex: Integer; // 輸出數據塊索引
    FExportTotalSize: Integer; // 記錄輸出緩存塊大小
    ShiftBits: Integer; // 用于位處理,作臨時位
    ShiftCode: Integer; // 用于位處理,作臨時代碼
  protected
    procedure ExportData(AData: Integer); virtual; // 輸出數據(虛方法)
  public
    function GetExportPointer: Pointer; // 返回輸出指針
    function GetExportSize: Integer; // 返回輸出大小
    procedure GetBegin; // 置開始編碼標志
    procedure GetEnd; // 置結束編碼標志
    procedure Execute(Data: array of Byte; DataSize: Integer); virtual; // 執行編碼過程(虛方法)
    constructor Create;
    destructor Destroy; override;
  end;

  TLZWUnencode = class(TObject)
  private
    InitBits: Integer; // 壓縮數據的起始位數
    ClearCode: Integer; // 清除碼
    EofCode: Integer; // 結束碼
    PrefixCode: Integer; // 字頭碼
    SuffixCode: Integer; // 字尾碼
    Encode: Integer; // 壓縮編碼
    RunBits: Integer; // 當前處理位
    MaxCodeSize: Integer; // 當前處理最大編碼
    ExportBlock: Pointer; // 存放編碼后的數據指針(輸出緩存塊指針)
    ExportBlockPtr: array of Byte; // 該指針指向 ExportBlock ,用于訪問數組
    StackIndex: Integer; // 棧索引
    StackTable: array [0..LZWSTACKBUFFERSIZE - 1] of Byte; // 棧表
    PrefixTable: array [0..LZWMAXCODES - 1] of Word; // 字頭表
    SuffixTable: array [0..LZWMAXCODES - 1] of Byte; // 字尾表
    FExportSize: Integer; // 輸出數據塊大小
    FExportIndex: Integer; // 輸出數據塊索引
    FExportTotalSize: Integer; // 記錄輸出緩存塊大小
    ShiftBits: Integer; // 用于位處理,作臨時位
    ShiftCode: Integer; // 用于位處理,作臨時代碼
  protected
    procedure ExportData(AData: Integer); virtual; // 輸出數據(虛方法)
  public
    function GetExportPointer: Pointer; // 返回輸出指針
    function GetExportSize: Integer; // 返回輸出大小
    procedure GetBegin; // 開始解碼(分配輸出內存空間)
    procedure GetEnd; // 結束解碼(釋放輸出內存空間)
    procedure Execute(Data: array of Byte; DataSize: Integer); virtual; // 執行解碼過程(虛方法)
    constructor Create;
    destructor Destroy; override;
  end;

implementation

{ TLZWEncode }

constructor TLZWEncode.Create;
begin
  InitBits := LZWBITS;
  ClearCode := 1 shl InitBits;
  EofCode := ClearCode + 1;
  Encode := EofCode + 1;
  RunBits := InitBits + 1;
  MaxCodeSize := 1 shl RunBits;
  FBegin := False;
  FExportSize := 0;
  FExportIndex := 0;
  FExportTotalSize := 0;
  ShiftBits := 0;
  ShiftCode := 0;
end;

destructor TLZWEncode.Destroy;
begin
  FreeMem(ExportBlock);
  inherited;
end;

procedure TLZWEncode.Execute(Data: array of Byte; DataSize: Integer);
var
  AIndex: Integer;
  ArrayIndex: Integer;
  Vi: Integer;
begin
  AIndex := 0;
  FExportIndex := 0;
  FExportTotalSize := LZWEXPORTBLOCKSIZE;
  { 處理文件首字節,賦值給字頭碼 }
  if FBegin then
  begin
    FBegin := False;
    ExportData(ClearCode);
    PrefixCode := Data[AIndex];
    Inc(AIndex);
  end;
  { 編碼過程 }
  while AIndex < DataSize do
  begin
    { 取出數據,賦值給字尾碼 }
    SuffixCode := Data[AIndex];
    Inc(AIndex);
    { 構造地址 }
    ArrayIndex := (PrefixCode shl LZWBITS) + SuffixCode;
    { 無可編碼字對的情況 }
    if EncodeTable[ArrayIndex] = 0 then
    begin
      ExportData(PrefixCode); // 輸出字頭
      { 當前編碼等于最大編碼值的情況,作初始化工作 }
      if Encode = LZWMAXCODES then
      begin
        ExportData(ClearCode); // 輸出清除碼
        Encode := EofCode + 1;
        RunBits := InitBits + 1;
        MaxCodeSize := 1 shl RunBits;
        { 只需初始化編碼過的內存區 }
        for Vi := Encode to LZWMAXCODES - 1 do
          EncodeTable[EncodePointer[Vi]] := 0;
      end
      else begin
        { 當前編碼等于最大處理編碼的情況 }
        if Encode = MaxCodeSize then
        begin
          Inc(RunBits); // 當前處理位增加
          MaxCodeSize := 1 shl RunBits; // 相應最大編碼增加
        end;
        EncodeTable[ArrayIndex] := Encode; // 加入編碼表
        EncodePointer[Encode] := ArrayIndex;
        Inc(Encode);
      end;
      PrefixCode := SuffixCode;
    end
    { 編碼可匹配的情況 }
    else begin
      PrefixCode := EncodeTable[ArrayIndex];
    end;
  end;
end;

procedure TLZWEncode.ExportData(AData: Integer);
{ 輸出過程 }
  procedure ExportProcedure;
  begin
    while ShiftBits >= LZWBITS do
    begin
      ExportBlockPtr[FExportIndex] := ShiftCode and $00FF;
      Inc(FExportIndex);
      if FExportIndex = FExportTotalSize then
      begin
        { 重新分配內存后首地址可能改變 }
        ReallocMem(ExportBlock, FExportIndex + LZWEXPORTBLOCKSIZE);
        Pointer(ExportBlockPtr) := ExportBlock;
        Inc(FExportTotalSize, LZWEXPORTBLOCKSIZE);
      end;
      ShiftCode := ShiftCode shr LZWBITS;
      Dec(ShiftBits, LZWBITS);
    end;
  end;
begin
  { 輸出位總是大于 LZWBITS 的 }
  ShiftCode := AData shl ShiftBits + ShiftCode;
  Inc(ShiftBits, RunBits);
  ExportProcedure;
end;

function TLZWEncode.GetExportPointer: Pointer;
begin
  Result := ExportBlock;
end;

function TLZWEncode.GetExportSize: Integer;
begin
  FExportSize := FExportIndex;
  Result := FExportSize;
end;

procedure TLZWEncode.GetBegin;
begin
  FBegin := True;
  { 有可能輸出緩存大于輸入緩存,如果發生,到時再重新分配內存 }
  ExportBlock := AllocMem(LZWEXPORTBLOCKSIZE);
  Pointer(ExportBlockPtr) := ExportBlock;
end;

procedure TLZWEncode.GetEnd;
begin
  ExportData(PrefixCode);
  EXportData(EofCode);
  { 最后的處理是看看有沒有沒處理的位 }
  while ShiftBits > 0 do
  begin
    ExportBlockPtr[FExportIndex] := ShiftCode and $00FF;
    Inc(FExportIndex);
    if FExportIndex = FExportTotalSize then
    begin
      ReallocMem(ExportBlock, FExportIndex + LZWEXPORTBLOCKSIZE);
      Pointer(ExportBlockPtr) := ExportBlock;
      Inc(FExportTotalSize, LZWEXPORTBLOCKSIZE);
    end;
    ShiftCode := ShiftCode shr LZWBITS;
    Dec(ShiftBits, LZWBITS);
  end;
end;

{ TLZWUnencode }

constructor TLZWUnencode.Create;
begin
  InitBits := LZWBITS;
  ClearCode := 1 shl InitBits;
  EofCode := ClearCode + 1;
  Encode := EofCode + 1;
  RunBits := InitBits + 1;
  MaxCodeSize := 1 shl RunBits;
  ShiftBits := 0;
  ShiftCode := 0;
  FExportSize := 0;
  FExportIndex := 0;
  FExportTotalSize := 0;
end;

destructor TLZWUnencode.Destroy;
begin
  inherited;
end;

procedure TLZWUnencode.Execute(Data: array of Byte; DataSize: Integer);
const
  MaskCode: array [0..LZWMAXBITS] of Word = (
    $0000, $0001, $0003, $0007,
    $000F, $001F, $003F, $007F,
    $00FF, $01FF, $03FF, $07FF,
    $0FFF);
var
  AIndex: Integer;
  CurrentCode, ACode: Integer;
begin
  AIndex := 0;
  FExportIndex := 0;
  FExportTotalSize := LZWSTACKBUFFERSIZE;
  { 解碼過程 }
  while AIndex < DataSize do
  begin
    { 取出數據 }
    while (ShiftBits < RunBits) and (AIndex < DataSize) do
    begin
      ShiftCode := Data[AIndex] shl ShiftBits + ShiftCode;
      Inc(AIndex);
      Inc(ShiftBits, LZWBITS);
    end;

    if AIndex >= DataSize then
      Exit;
    CurrentCode := ShiftCode and MaskCode[RunBits];
    ShiftCode := ShiftCode shr RunBits;
    Dec(ShiftBits, RunBits);
    { 遇到結束碼則退出 }
    if CurrentCode = EofCode then
      Exit;
    { 遇到清除碼則初始化 }
    if CurrentCode = ClearCode then
    begin
      RunBits := InitBits + 1;
      Encode := EofCode + 1;
      MaxCodeSize := 1 shl RunBits;
      PrefixCode := NOCODE;
      SuffixCode := NOCODE;
    end
    else
    begin
      ACode := CurrentCode;
      StackIndex := 0;
      { 當前代碼正好與當前編碼值相等的情況 }
      if ACode = Encode then
      begin
        StackTable[StackIndex] := SuffixCode;
        Inc(StackIndex);
        ACode := PrefixCode;
      end;
      { 當前代碼大于當前編碼值的情況,遞歸取值 }
      while ACode > EofCode do
      begin
        StackTable[StackIndex] := SuffixTable[ACode];
        Inc(StackIndex);
        ACode := PrefixTable[ACode];
      end;
      SuffixCode := ACode;
      { 輸出數據 }
      ExportData(ACode);
      while StackIndex > 0 do
      begin
        Dec(StackIndex);
        ExportData(StackTable[StackIndex]);
      end;
      { 加入字典 }
      if (Encode < LZWMAXCODES) and (PrefixCode <> NOCODE) then
      begin
        PrefixTable[Encode] := PrefixCode;
        SuffixTable[Encode] := SuffixCode;
        Inc(Encode);
        if (Encode >= MaxCodeSize) and (RunBits < LZWMAXBITS) then
        begin
          MaxCodeSize := MaxCodeSize shl 1;
          Inc(RunBits);
        end;
      end;
      PrefixCode := CurrentCode;
    end;
  end;
end;

procedure TLZWUnencode.ExportData(AData: Integer);
begin
  ExportBlockPtr[FExportIndex] := AData;
  Inc(FExportIndex);
  if FExportIndex = FExportTotalSize then
  begin
    ReallocMem(ExportBlock, FExportIndex + LZWSTACKBUFFERSIZE);
    Pointer(ExportBlockPtr) := ExportBlock;
    Inc(FExportTotalSize, LZWSTACKBUFFERSIZE);
  end;
end;

procedure TLZWUnencode.GetBegin;
begin
  ExportBlock := AllocMem(LZWSTACKBUFFERSIZE);
  Pointer(ExportBlockPtr) := ExportBlock;
end;

procedure TLZWUnencode.GetEnd;
begin
  FreeMem(ExportBlock);
end;

function TLZWUnencode.GetExportPointer: Pointer;
begin
  Result := ExportBlock;
end;

function TLZWUnencode.GetExportSize: Integer;
begin
  FExportSize := FExportIndex;
  Result := FExportSize;
end;

end.

?? 快捷鍵說明

復制代碼 Ctrl + C
搜索代碼 Ctrl + F
全屏模式 F11
切換主題 Ctrl + Shift + D
顯示快捷鍵 ?
增大字號 Ctrl + =
減小字號 Ctrl + -
亚洲欧美第一页_禁久久精品乱码_粉嫩av一区二区三区免费野_久草精品视频
欧美亚洲综合一区| 老司机免费视频一区二区| 精品国产一区二区在线观看| 2017欧美狠狠色| 精品少妇一区二区三区在线视频| 欧美亚洲日本国产| 欧美日韩一级黄| 欧美日韩午夜在线| 欧美精品vⅰdeose4hd| 欧美人牲a欧美精品| 欧美一区二区三区婷婷月色| 欧美一区二区在线免费播放| 日韩欧美国产一区在线观看| 久久美女高清视频| 中文字幕欧美日本乱码一线二线 | 最近日韩中文字幕| 亚洲码国产岛国毛片在线| 亚洲在线视频网站| 日韩精品一级中文字幕精品视频免费观看 | 亚洲男人的天堂在线观看| 国产精品白丝jk白祙喷水网站| 毛片基地黄久久久久久天堂| 国产麻豆成人精品| 91一区一区三区| 欧美蜜桃一区二区三区| 精品成人免费观看| 国产精品久久久久久久久免费樱桃 | 亚洲大片免费看| 久久国产三级精品| 成a人片亚洲日本久久| 欧美亚洲综合在线| 国产午夜精品理论片a级大结局| 亚洲欧洲av一区二区三区久久| 亚洲午夜免费电影| 精品一区二区三区不卡 | 日日摸夜夜添夜夜添精品视频| 韩国成人在线视频| 在线区一区二视频| 久久精品亚洲麻豆av一区二区| 亚洲精品美腿丝袜| 国产精品69毛片高清亚洲| 色婷婷综合久久久久中文一区二区| 制服丝袜亚洲网站| 亚洲美女免费在线| 国产精品99久久久久| 欧美图区在线视频| 国产精品传媒视频| 久久不见久久见免费视频1| 色美美综合视频| 国产日韩三级在线| 美女在线观看视频一区二区| 91色.com| 国产精品久久久久婷婷二区次| 日本成人超碰在线观看| 在线视频国内自拍亚洲视频| 久久精品欧美日韩| 精品一区二区精品| 91精品欧美福利在线观看| 亚洲欧美国产三级| 波波电影院一区二区三区| 精品捆绑美女sm三区| 五月激情六月综合| 欧美视频在线不卡| 亚洲女人的天堂| 日韩欧美国产综合在线一区二区三区| 一区二区三区.www| 91美女在线视频| 成人免费在线视频观看| 国产乱人伦精品一区二区在线观看| 9191精品国产综合久久久久久| 一区二区三区中文字幕在线观看| 成人福利视频在线看| 国产亚洲精品bt天堂精选| 黄页网站大全一区二区| 精品国产乱码久久久久久久| 免费成人结看片| 日韩精品最新网址| 激情六月婷婷久久| 久久久亚洲高清| 国产成人免费在线视频| 久久久久久黄色| 国产成人午夜精品5599| 国产精品视频麻豆| 91免费国产视频网站| 亚洲日穴在线视频| 欧美视频日韩视频在线观看| 午夜视频一区二区| 91精品国产色综合久久不卡蜜臀 | 国产中文字幕一区| 久久精品人人做人人爽人人| 国产一区欧美一区| 国产精品嫩草影院av蜜臀| 91在线视频免费观看| 亚洲国产视频一区二区| 日韩一区二区精品葵司在线| 美女久久久精品| 国产精品人成在线观看免费| 91在线视频18| 秋霞国产午夜精品免费视频| 香蕉乱码成人久久天堂爱免费| 欧美日韩国产综合草草| 九九九久久久精品| 中文字幕综合网| 欧美日韩高清在线| 国产白丝网站精品污在线入口| 17c精品麻豆一区二区免费| 欧美性猛交xxxx乱大交退制版 | 中文字幕视频一区二区三区久| 91丨九色丨蝌蚪丨老版| 男女男精品视频网| 国产精品国产成人国产三级| 91久久国产最好的精华液| 蜜臀精品一区二区三区在线观看| 中文字幕欧美激情| 91精品国产全国免费观看| 成人一道本在线| 日本成人在线不卡视频| 国产精品家庭影院| 日韩一级欧美一级| 一本久久综合亚洲鲁鲁五月天| 日韩黄色免费电影| 国产精品久99| 国产午夜精品一区二区三区嫩草| 欧美日韩美少妇| eeuss国产一区二区三区| 久久精品国产秦先生| 国产精品亚洲综合一区在线观看| 一区二区三区蜜桃网| 久久精品一区四区| 日韩欧美在线123| 欧美自拍丝袜亚洲| 成人性生交大片免费| 蜜桃91丨九色丨蝌蚪91桃色| 亚洲综合在线第一页| 国产精品乱码久久久久久| 精品少妇一区二区三区在线视频| 欧美网站大全在线观看| 91麻豆国产在线观看| 国产98色在线|日韩| 免费观看在线综合| 亚洲福利电影网| 亚洲综合另类小说| 一区二区三区欧美日| 国产精品不卡视频| 国产精品免费免费| 久久久99精品久久| 国产色91在线| 中文字幕欧美激情一区| 国产欧美一区二区在线观看| 久久精品网站免费观看| 久久蜜桃av一区二区天堂| 久久综合精品国产一区二区三区| 欧美一区二区在线免费播放| 欧美精品xxxxbbbb| 在线播放亚洲一区| 日韩免费在线观看| www精品美女久久久tv| 久久婷婷综合激情| 日本一区二区三区国色天香| 久久久久9999亚洲精品| 国产欧美精品一区| 最新国产成人在线观看| 一区二区视频免费在线观看| 亚洲一区av在线| 日精品一区二区| 国产一区视频导航| 不卡的电影网站| 欧美性一级生活| 日韩亚洲欧美在线观看| 欧美精品一区二区三区很污很色的 | 蓝色福利精品导航| 国产一区在线观看视频| 成人免费va视频| 欧美三级视频在线| 日韩美一区二区三区| 精品免费国产一区二区三区四区| 久久精品日产第一区二区三区高清版 | 精品一二三四区| 东方aⅴ免费观看久久av| 91丝袜高跟美女视频| 91麻豆精品国产91久久久久久| 欧美电视剧在线观看完整版| 国产精品美女久久久久久| 一区二区三区四区国产精品| 午夜视频一区在线观看| 国产成人av一区二区| 欧美影院精品一区| 欧美xxxxxxxx| 伊人性伊人情综合网| 麻豆视频一区二区| 99久久精品国产一区二区三区| 欧美视频精品在线| 久久久久久久精| 亚洲第一激情av| 成人一区二区视频| 日韩欧美国产一区二区在线播放| 国产精品美女一区二区在线观看| 天涯成人国产亚洲精品一区av| 国产福利不卡视频| 日韩亚洲欧美在线观看|