原文的解密方式如下
unit Logo;
interface
uses
Windows, SysUtils, Classes, Graphics, HGETextures, HGEBase, DirectXGraphics, HGECanvas, Grobal2;
{.$IF Var_Free = 1}
{.$INCLUDE LogoBitempFree.inc}
{.$ELSE}
{$INCLUDE LogoBitemp.inc}
{.$IFEND}
var
g_LogoSurface: TDirectDrawSurface = nil;
procedure CreateLogoSurface();
procedure DestroyLogoSurface();
implementation
uses
CLMain;
function DecodeRLE(const Source, Target: Pointer; Count: Cardinal; bitLength: Byte): Boolean;
var
I, j: Integer;
SourcePtr,
TargetPtr: PByte;
RunLength: Cardinal;
Counter: Cardinal;
begin
Counter := 0;
TargetPtr := Target;
SourcePtr := Source;
while Counter < Count do begin
RunLength := 1 + (SourcePtr^ and $7F);
if SourcePtr^ > $7F then begin
Inc(SourcePtr);
for I := 0 to RunLength - 1 do begin
for j := 1 to bitLength - 1 do
begin
TargetPtr^ := SourcePtr^;
Inc(SourcePtr);
Inc(TargetPtr);
end;
TargetPtr^ := SourcePtr^;
Dec(SourcePtr, bitLength - 1);
Inc(TargetPtr);
end;
Inc(SourcePtr, bitLength);
end
else begin
Inc(SourcePtr);
Move(SourcePtr^, TargetPtr^, bitLength * RunLength);
Inc(SourcePtr, bitLength * RunLength);
Inc(TargetPtr, bitLength * RunLength);
end;
Inc(Counter, bitLength * RunLength);
end;
Result := Counter = Count;
end;
function DecodeRLET(const Source, Target: Pointer; Count: Cardinal; bitLength: Byte): Boolean;
var
I, j: Integer;
SourcePtr,
TargetPtr: PByte;
RunLength: Cardinal;
Counter: Cardinal;
begin
Counter := 0;
TargetPtr := Target;
SourcePtr := Source;
while Counter < Count do begin
RunLength := 1 + (SourcePtr^ and $7F);
if SourcePtr^ > $7F then begin
Inc(SourcePtr);
for I := 0 to RunLength - 1 do begin
for j := 1 to bitLength - 1 do
begin
TargetPtr^ := SourcePtr^;
Inc(SourcePtr);
Inc(TargetPtr);
end;
TargetPtr^ := SourcePtr^;
Dec(SourcePtr, bitLength - 1);
Inc(TargetPtr);
end;
Inc(SourcePtr, bitLength);
end
else begin
Inc(SourcePtr);
Move(SourcePtr^, TargetPtr^, bitLength * RunLength);
Inc(SourcePtr, bitLength * RunLength);
Inc(TargetPtr, bitLength * RunLength);
end;
Inc(Counter, bitLength * RunLength);
end;
Result := Counter = Count;
end;
procedure CreateLogoSurface();
var
Access: TDXAccessInfo;
WriteBuffer, ReadBuffer, DecodeBuffer: PChar;
Y: Integer;
begin
DestroyLogoSurface();
g_LogoSurface := TDXImageTexture.Create(g_DXCanvas);
g_LogoSurface.Size := Point(LogoWidth, LogoHeight);
g_LogoSurface.PatternSize := Point(LogoWidth, LogoHeight);
g_LogoSurface.Format := D3DFMT_A8R8G8B8;
g_LogoSurface.Active := True;
if g_LogoSurface.Active then begin
if g_LogoSurface.Lock(lfWriteOnly, Access) then begin
GetMem(DecodeBuffer, LogoWidth * LogoHeight * 4);
Try
if DecodeRLE(@LogoBuffer, DecodeBuffer, LogoWidth * LogoHeight * 4, 4) then
begin
for Y := 0 to LogoHeight - 1 do begin
ReadBuffer := @DecodeBuffer[Y * LogoWidth * 4];
WriteBuffer := Pointer(Integer(Access.Bits) + (Access.Pitch * Y));
Move(ReadBuffer^, WriteBuffer^, LogoWidth * 4);
end;
end;
{for Y := 0 to LogoHeight - 1 do begin
ReadBuffer := @LogoBuffer[Y * LogoWidth * 2];
WriteBuffer := Pointer(Integer(Access.Bits) + (Access.Pitch * Y));
Move(ReadBuffer^, WriteBuffer^, LogoWidth * 2);
end;}
Finally
FreeMem(DecodeBuffer);
g_LogoSurface.Unlock;
End;
end;
end else begin
g_LogoSurface.Free;
g_LogoSurface := nil;
end;
end;
procedure DestroyLogoSurface();
begin
if g_LogoSurface <> nil then g_LogoSurface.Free;
g_LogoSurface := nil;
end;
end.
加密后的格式
Const
LogoWidth = 444;
LogoHeight = 100;
LogoBuffer: array[0..41798 - 1] of Byte = (
$FF, $FF, $FF, $FF, $00, $FF, $FF, $FF, $FF, $00, $FF, $FF, $FF, $FF, $00, $FF,
$FF, $FF, $FF, $00, $FF, $FF, $FF, $FF, $00, $FF, $FF, $FF, $FF, $00, $FF, $FF,
$FF, $FF, $00, $FF, $FF, $FF, $FF, $00, $FF, $FF, $FF, $FF, $00, $FF, $FF, $FF,
$FF, $00, $FF, $FF, $FF, $FF, $00, $FF, $FF, $FF, $FF, $00, $FF, $FF, $FF, $FF,
$00, $F3, $FF, $FF, $FF, $00, $8B, $00, $00, $00, $00, $A0, $FB, $FB, $FB, $00,
$81, $FF, $FF, $FF, $00, $82, $FB, $FB, $FB, $00, $81, $FF, $FF, $FF, $00, $06,
$00, $00, $00, $01, $6D, $6D, $6D, $09, $68, $68, $68, $17, $9E, $9E, $9E, $46,
$E9, $E9, $E9, $7F, $D3, $D3, $D3, $72, $DD, $DD, $DD, $00, $90, $FB, $FB, $FB,
$00, $83, $00, $00, $00, $00, $FF, $FF, $FF, $FF, $00, $FF, $FF, $FF, $FF, $00,
$EB, $FF, $FF, $FF, $00, $8B, $00, $00, $00, $00, $9F, $FB, $FB, $FB, $00, $81,
$FF, $FF, $FF, $00, $81, $FB, $FB, $FB, $00, $81, $FF, $FF, $FF, $00, $08, $00,
$00, $00, $03, $43, $43, $43, $12, $84, $84, $84, $41, $AA, $AA, $AA, $92, $E2,
$E2, $E2, $D0, $F7, $F7, $F7, $F5, $ED, $ED, $ED, $FB, $BA, $BA, $BA, $CB, $CA,
$CA, $CA, $00, $90, $FB, $FB, $FB, $00, $83, $00, $00, $00, $00, $FF, $FF, $FF,
$FF, $00, $FF, $FF, $FF, $FF, $00, $EB, $FF, $FF, $FF, $00, $8B, $00, $00, $00,
$00, $9E, $FB, $FB, $FB, $00, $00, $FF, $FF, $FF, $00, $81, $FB, $FB, $FB, $00,
$07, $FF, $FF, $FF, $00, $00, $00, $00, $01, $00, $00, $00, $04, $55, $55, $55,
$19, $7C, $7C, $7C, $54, $A9, $A9, $A9, $BA, $F7, $F7, $F7, $F6, $FF, $FF, $FF,
$FF, $81, $FB, $FB, $FB, $FF, $02, $E8, $E8, $E8, $FF, $B5, $B5, $B5, $C7, $CC, …………等等
求個Demo,謝謝大俠們!
uj5u.com熱心網友回復:
大俠們幫幫忙啊~~轉載請註明出處,本文鏈接:https://www.uj5u.com/houduan/143604.html
上一篇:gps坐標轉換代碼
