📄 unit1.pas
字号:
unit Unit1;
interface
uses
Windows, Messages, SysUtils, Variants, Classes, Graphics, Controls, Forms,
Dialogs, encddecd,des, StdCtrls, FileCtrl;
const
BOM_UTF16_LSB: array [0..1] of Byte = ($FF,$FE);
BOM_UTF16_MSB: array [0..1] of Byte = ($FE,$FF);
BOM_UTF8: array [0..2] of Byte = ($EF,$BB,$BF);
BOM_UTF32_LSB: array [0..3] of Byte = ($FF,$FE,$00,$00);
BOM_UTF32_MSB: array [0..3] of Byte = ($00,$00,$FE,$FF);
// BOM_UTF7_1: array [0..3] of Byte = ($2B,$2F,$76,$38);
// BOM_UTF7_2: array [0..3] of Byte = ($2B,$2F,$76,$39);
// BOM_UTF7_3: array [0..3] of Byte = ($2B,$2F,$76,$2B);
// BOM_UTF7_4: array [0..3] of Byte = ($2B,$2F,$76,$2F);
// BOM_UTF7_5: array [0..3] of Byte = ($2B,$2F,$76,$38,$2D);
type
TEncodingType = (
etAnsi, // ANSI format (SBCS/DBCS)
etUTF8, // UTF-8 format
etUnicode, // UTF-16 format using little endian
etUnicodeBE, // UTF-16 format using big endian
etUTF32, // UTF-32 format using little endian
etUTF32BE // UTF-32 format using big endian
);
TByteOrderMask = array of Byte;
TForm1 = class(TForm)
Button1: TButton;
Button2: TButton;
Editkey: TEdit;
Editiv: TEdit;
Edit1: TEdit;
Edit2: TEdit;
Button3: TButton;
Button4: TButton;
Button5: TButton;
Button6: TButton;
Button7: TButton;
Memo1: TMemo;
DirectoryListBox1: TDirectoryListBox;
FileListBox1: TFileListBox;
Button8: TButton;
Button9: TButton;
procedure Button1Click(Sender: TObject);
procedure Button2Click(Sender: TObject);
procedure Button3Click(Sender: TObject);
procedure Button4Click(Sender: TObject);
procedure FormCreate(Sender: TObject);
procedure Button5Click(Sender: TObject);
procedure Button6Click(Sender: TObject);
procedure Button7Click(Sender: TObject);
procedure Button8Click(Sender: TObject);
procedure Button9Click(Sender: TObject);
private
{ Private declarations }
des:tdes;
public
{ Public declarations }
end;
var
Form1: TForm1;
implementation
uses LbCipher;
{$R *.dfm}
function des_Encode(key:array of Byte;iv:array of Byte):string;
begin
end;
procedure TForm1.Button1Click(Sender: TObject);
var
Encrypt:bool;
temp,res:String;
key:TKey64;
i,j,len,posnum:integer;
iv:TDESBlock;
Context : TDESContext;
poschar:char;
Block:TDESBlock;
begin
Encrypt := true;
temp := Editkey.Text;
res := '';
for i:=0 to 7 do begin
if i > (length(temp)-1) then
key[i] :=0
else
key[i] := byte(temp[i+1]);
end;
temp := Editiv.Text;
for i:=0 to 7 do begin
if i > (length(temp)-1) then
iv[i]:=0
else
iv[i] := byte(temp[i+1]);
end;
iv[0]:=18;iv[1]:=52;iv[2]:=86;iv[3]:=120;
iv[4]:=144;iv[5]:=171;iv[6]:=205;iv[7]:=239;
InitEncryptDES(Key, Context, Encrypt);
temp := AnsiToUtf8(edit1.Text);
len := length(temp);
temp := temp+ char( 8- (len mod 8));
posnum := 0;
for i:=0 to len do begin
poschar:= temp[i+1];
Block[posnum] := byte(poschar);
posnum := posnum +1;
if posnum = 8 then begin
EncryptDESCBC(Context, IV, Block);
for j:= 0 to 7 do begin
res := res + char(block[j]);
end;
iv := block;
posnum := 0;
end;
end;
if posnum <> 0 then begin
for i:=posnum to 7 do begin
Block[i] := byte(poschar);
end;
EncryptDESCBC(Context, IV, Block);
for j:= 0 to 7 do begin
res := res + char(block[j]);
end;
posnum := 0;
end;
edit2.Text := EncodeString(res);
end;
procedure TForm1.Button2Click(Sender: TObject);
var
Encrypt:bool;
temp,res:String;
key:TKey64;
i,j,len,posnum:integer;
iv:TDESBlock;
Context : TDESContext;
poschar:char;
bak,Block:TDESBlock;
begin
Encrypt := false;
temp := editkey.Text;
res := '';
for i:=0 to 7 do begin
if i > (length(temp)-1) then
key[i] :=0
else
key[i] := byte(temp[i+1]);
end;
temp := editiv.Text;
for i:=0 to 7 do begin
if i > (length(temp)-1) then
iv[i] := 0
else
iv[i] := byte(temp[i+1]);
end;
iv[0]:=18;iv[1]:=52;iv[2]:=86;iv[3]:=120;
iv[4]:=144;iv[5]:=171;iv[6]:=205;iv[7]:=239;
InitEncryptDES(Key, Context, Encrypt);
//for i:=0 to 7 do block[0] := 0;
temp := DecodeString(edit2.Text) ;
posnum := 0;
for i:=0 to length(temp)-1 do begin
Block[posnum] := byte(temp[i+1]);
posnum := posnum+1;
if posnum = 8 then begin
bak := block;
EncryptDESCBC(Context, IV, Block);
for j:= 0 to 7 do begin
// temp := temp+inttostr(byte(block[i]))+' ';
res := res + char(block[j]);
end;
iv := bak;
posnum := 0;
end;
end;
if posnum <> 0 then begin
showmessage('解密出错');
end else begin
temp:='';
//len := res[length(res)] ;
for i:= 1 to length(res) do begin
temp := temp+char(res[i]);
end;
edit1.Text := Utf8ToAnsi(trim(temp));
end;
end;
function AnsiLength(const s: string): Integer;
begin
Result := MultiByteToWideChar(CP_ACP, 0, PAnsiChar(s), -1, nil, 0);
if Result > 0 then Dec(Result); // 除去终止符
end;
function AnsiLength1(const s: string): integer;
var
p, q: PChar;
begin
Result := 0;
p := PChar(s);
q := p + Length(s);
while p < q do
begin
Inc(Result);
if p^ in LeadBytes then // 当前系统代码页的前导字节数组
Inc(p, 2)
else
Inc(p);
end;
end;
procedure TForm1.Button3Click(Sender: TObject);
var
str: string;
begin
str := '汉字ABC';
Assert(Length(str) = 7); // 7个字节
Assert(AnsiLength(str) = 5); // 5个字符
end;
procedure CopyBytes(const source: array of Byte; var target: TByteOrderMask);
var
n: Integer;
s: array of Byte;
begin
n := Length(source);
SetLength(target, n);
if n > 0 then
begin
Move(source[0], target[0], n);
end;
end;
function TryGetBOM(const encodingType: TEncodingType; var bom: TByteOrderMask): Boolean;
begin
Result := True;
case encodingType of
etUTF8: CopyBytes(BOM_Utf8, bom);
etUnicode: CopyBytes(BOM_UTF16_LSB, bom);
etUnicodeBE: CopyBytes(BOM_UTF16_MSB, bom);
etUTF32: CopyBytes(BOM_UTF32_LSB, bom);
etUTF32BE: CopyBytes(BOM_UTF32_MSB, bom);
else
begin
SetLength(bom, 0);
Result := False;
end;
end;
end;
function CompareBOM(pBuffer: PAnsiChar; const bom: array of Byte): Boolean;
var
i: Integer;
begin
Result := False;
for i := Low(bom) to High(bom) do
begin
Result := (pBuffer^ <> #0) and (PByte(pBuffer)^ = bom[i]);
if not Result then Break;
Inc(pBuffer);
end;
end;
function DetectEncoding(buffer: PAnsiChar): TEncodingType; overload;
begin
if CompareBOM(buffer, BOM_UTF8) then
Result := etUTF8
else if CompareBOM(buffer, BOM_UTF16_LSB) then
Result := etUnicode
else if CompareBOM(buffer, BOM_UTF16_MSB) then
Result := etUnicodeBE
else if CompareBOM(buffer, BOM_UTF32_LSB) then
Result := etUTF32
else if CompareBOM(buffer, BOM_UTF32_MSB) then
Result := etUTF32BE
else
Result := etAnsi;
end;
function DetectEncoding(stream: TStream): TEncodingType; overload;
var
pos: Int64;
bytes: TByteOrderMask;
begin
SetLength(bytes, 6);
ZeroMemory(@bytes[0], Length(bytes));
pos := stream.Seek(0, soFromCurrent);
stream.Seek(0, soFromBeginning);
stream.Read(bytes[0], SizeOf(bytes));
stream.Seek(pos, soFromBeginning);
Result := DetectEncoding(PAnsiChar(@bytes[0]));
end;
procedure WriteText(stream: TStream; const buffer: WideString;
const encodingType: TEncodingType; withBom: Boolean = False);
var
s: AnsiString;
p: PAnsiChar;
bom: TByteOrderMask;
bytes: Integer;
begin
p := nil;
bytes := Length(buffer) * SizeOf(WideChar);
if withBom and TryGetBOM(encodingType, bom) then
begin
stream.Write(bom[0], Length(bom));
end;
case encodingType of
etAnsi:
begin
p := PAnsiChar(buffer);
bytes := Length(buffer);
end;
etUTF8:
begin
s := Utf8Encode(buffer);
p := PAnsiChar(s);
bytes := Length(s);
end;
etUnicode:
begin
p := PAnsiChar(PWideChar(buffer));
end;
etUnicodeBE:
begin
// StrSwapByteOrder(PWideChar(buffer));
p := PAnsiChar(PWideChar(buffer));
end;
else // 留给读者去实现
begin
raise Exception.Create('Not Implemented.');
end;
end;
stream.Write(p^, bytes);
end;
procedure TForm1.Button4Click(Sender: TObject);
begin
case DetectEncoding(PAnsiChar(AnsiToUtf8('士大夫士大夫'))) of
etAnsi:
begin
edit1.text:= 'Ansi' ;
end;
etUTF8:
begin
edit1.text:= 'UTF8' ;
end;
etUnicode:
begin
edit1.text:= 'Unicode' ;
end;
etUnicodeBE:
begin
edit1.text:= 'UnicodeBE' ;
end;
else // 留给读者去实现
begin
raise Exception.Create('Not Implemented.');
end;
end;
end;
procedure TForm1.FormCreate(Sender: TObject);
var
key:array [0..7] of Byte;
i,j,len,posnum:integer;
iv:array [0..7] of Byte;
temp:String;
begin
temp := Editkey.Text;
for i:=0 to 7 do begin
if i > (length(temp)-1) then
key[i] :=0
else
key[i] := byte(temp[i+1]);
end;
iv[0]:=18;iv[1]:=52;iv[2]:=86;iv[3]:=120;
iv[4]:=144;iv[5]:=171;iv[6]:=205;iv[7]:=239;
des:=tdes.Create(key,iv,'gbk2312');
end;
procedure TForm1.Button5Click(Sender: TObject);
begin
Edit2.Text:=des.Encode(Edit1.Text);
end;
procedure TForm1.Button6Click(Sender: TObject);
begin
Edit1.Text:=des.Decode(Edit2.Text);
end;
procedure TForm1.Button7Click(Sender: TObject);
var
s:TMemoryStream;
begin
s:=TMemoryStream.Create;
WriteText(s,'<%@xcSXdsdsadffffffffffffffff',etUTF8,false);
s.SaveToFile('c:\xxxxxxxxxxxx.jsp');
end;
procedure TForm1.Button8Click(Sender: TObject);
var
i:integer;
s:TMemoryStream;
begin
for i:=0 to FileListBox1.Items.Count-1 do
begin
s:=TMemoryStream.Create;
Memo1.Lines.LoadFromFile(FileListBox1.Directory+'\'+ FileListBox1.Items[i]);
WriteText(s,Memo1.Text,etUTF8,false);
s.SaveToFile(FileListBox1.Directory+'\'+ FileListBox1.Items[i]);
s.Free;
end;
end;
procedure TForm1.Button9Click(Sender: TObject);
var
i:integer;
s:TMemoryStream;
begin
s:=TMemoryStream.Create;
s.LoadFromFile('c:\xxxxxxxxxxxx.jsp');
DetectEncoding(s);
s.Free;
end;
end.
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -