zw84611 再把你的16进制编码的程序写个解码的吧,我搞不定!也欢迎各位大侠。(50分)

  • 主题发起人 主题发起人 fchyed
  • 开始时间 开始时间
F

fchyed

Unregistered / Unconfirmed
GUEST, unregistred user!
faint,岂有此理...
可以用十六进制显示并存入txt文件,如下面的方法
但这绝对是一个愚蠢的主意。
-------------------------------------
unit Unit1;

interface

uses
Windows, Messages, SysUtils, Classes, Graphics, Controls, Forms, Dialogs,
StdCtrls;

const BUF_SIZE=1024;

type
TForm1 = class(TForm)
Button1: TButton;
Memo1: TMemo;
procedure Button1Click(Sender: TObject);
private
{ Private declarations }
public
{ Public declarations }
end;

var
Form1: TForm1;
f:file of byte;
implementation

{$R *.DFM}

function Str2Hex(const data: array of byte; len: integer): string;
const
Hex:array[0..15] of char='0123456789ABCDEF';
var
i: Integer;
begin
setlength(result,length(data)*2);
for i := 0 to Len-1 do
begin
result[i*2+1]:=Hex[data shr 4];
result[i*2+2]:=Hex[data and $F];
end;
end;

procedure TForm1.Button1Click(Sender: TObject);
var
NumRead:integer;
b:array[1..BUF_SIZE] of byte;
s: string;
begin

assignfile(f,'T0105.101');
Reset(f);
repeat
BlockRead(f,b,BUF_SIZE,NumRead);
if NumRead=0 then break;
s:=Str2Hex(b,NumRead); //将每个字节以16进制表示
Memo1.Lines.Add(s);
until (NumRead = 0);
closefile(f);

Memo1.Lines.SaveToFile('binfile.txt');

end;

end.




就是把图片编为十六进制,然后再用解码程序解成 2进制,把图象再显示出来。
只是这个解码的程序没搞定,
编码的程序如上。
没分了,有了再给。
 
procedure TForm1.Button1Click(Sender: TObject);
var
F:TextFile;
Str:string;
Res:PChar;
Size:Integer;
Stream:TFileStream;
begin
AssignFile(F,'c:/aaa.txt'); //aaa.txt為編碼后的文件
try
Reset(F);
Stream:=TFileStream.Create('c:/aaa.gif',fmCreate); //解碼后目標文件
try
while not Eof(F) do
begin
ReadLn(F,Str);
Size:=Length(Str) div 2;
GetMem(Res,Size);
HexToBin(PChar(Str), Res, Size);
Stream.Write(Res[0],Size);
end;
finally
Stream.Free;
end;
finally
CloseFile(F);
end;
end;
 
试试这个:
function EncryptP(const S: String;dir:byte): String;
const
mm=7;
key:array[0..mm] of byte=($A2,$F9,$AA,$55,$E3,$6D,$8A,$47);
var
i, L : DWord;
b, k : byte;
begin
Result := '';
L:=Length(S);
if L<1 then exit;
k:=0;
if dir=0 then begin
//加密
for i := 1 to L do begin
b := byte(S) xor key[k];
Result := Result + IntToHex(b,2);
inc(k);
if k>7 then k:=0;
end
end else if dir=1 then begin
//还原
i:=1;
while i<L do begin
b:=HexCharToByte(S)*16+HexCharToByte(S[i+1]);
Result := Result + chr(b xor key[k]);
inc(i,2);
inc(k);
if k>7 then k:=0;
end;
end;
end;
 
看你提的好幾個問題都是因為這個困擾,特意為你寫了兩個過程,利用BinToHex,HexToBin來實現你的要求.
過程BinFileToHexFile為二進制文件轉為16進制文本文件.
過程HexFileToBinFile為16進制文本文件轉為二進制文件.
入口參數都為源文件名與目標文件名(含路徑).
調用:
BinFileToHexFile('C:/aaa.jpg', 'C:/aaa.txt');
HexFileToBinFile('C:/aaa.txt', 'C:/bbb.jpg');
==========================================================================
procedure BinFileToHexFile(const SrcFile,DestFile:string);
var
SrcStream,DestStream:TFileStream;
Buffer,OutCome:PChar;
ReadSize:Integer;
begin
SrcStream:=TFileStream.Create(SrcFile,fmOpenRead);
try
DestStream:=TFileStream.Create(DestFile,fmCreate);
try
GetMem(Buffer,BUF_SIZE);
try
GetMem(OutCome,BUF_SIZE*2);
try
while True do
begin
ReadSize:=SrcStream.Read(Buffer[0],BUF_SIZE);
if ReadSize=0 then Break;
BinToHex(Buffer,OutCome,ReadSize);
DestStream.Write(OutCome[0],ReadSize*2);
end;
finally
FreeMem(OutCome);
end;
finally
FreeMem(Buffer);
end;
finally
DestStream.Free;
end;
finally
SrcStream.Free;
end;
end;

procedure HexFileToBinFile(const SrcFile,DestFile:string);
var
SrcStream,DestStream:TFileStream;
Buffer,OutCome:PChar;
ReadSize:Integer;
begin
SrcStream:=TFileStream.Create(SrcFile,fmOpenRead);
try
DestStream:=TFileStream.Create(DestFile,fmCreate);
try
GetMem(Buffer,BUF_SIZE);
try
GetMem(OutCome,BUF_SIZE div 2);
try
while True do
begin
ReadSize:=SrcStream.Read(Buffer[0],BUF_SIZE);
if ReadSize=0 then Break;
HexToBin(Buffer,OutCome,ReadSize div 2);
DestStream.Write(OutCome[0],ReadSize div 2);
end;
finally
FreeMem(OutCome);
end;
finally
FreeMem(Buffer);
end;
finally
DestStream.Free;
end;
finally
SrcStream.Free;
end;
end;
 
另外,http://www.delphibbs.com/delphibbs/dispq.asp?lid=1703353 的貼子如果沒什麼問題,
能不能給結了? 謝謝!
 
非常感谢,我一定会努力的学习赶上各位!

smokingroom已经结帖。

这个我也会实验过后在几天内结帖!

非常感谢,在下真是不才,只会提问,非常羞愧!
 
多人接受答案了。
 
后退
顶部