请高手进来:关于用stream读取数据并进行转换的问题(200分)

  • 主题发起人 主题发起人 jsbyl
  • 开始时间 开始时间
J

jsbyl

Unregistered / Unconfirmed
GUEST, unregistred user!
小弟在编写程序的工程中,遇到了以下问题:
我写了一段加密程序,并将数据加密后存放到了一个文件中(如:a.dat,数据中包括了很多怪
字符,如果用ultraedit看将自动转换到16进制),我的目标是把数据从a.txt中读出来,并存放
到pchar型的变量buff中
1、如果用以下代码,数据读不出来,buff中没内容,为什么,有什么办法解决没有:
var
buff1:pchar;
ms1:TMemoryStream;
begin
ms1:=TMemoryStream.Create;
ms1.LoadFromFile('c:/a.dat');
buff1:=stralloc(ms1.size);
ms1.Readbuffer(buff1,ms1.Size);
end;
2、后来我自己想了一个方法,数据能读出来,但tmp中的是二进制,如何转换并将所有数据赋给buff1
var
tmp:array [1..1024] of byte;
ms1:TMemoryStream;
buff1:pchar;
begin
ms1:=TMemoryStream.Create;
ms1.LoadFromFile('c:/a.dat');
ms1.Readbuffer(tmp,ms1.Size);
end;
 
var
buff1:pchar;
ms1:TMemoryStream;
begin
ms1:=TMemoryStream.Create;
ms1.LoadFromFile('c:/a.dat');
buff1:=stralloc(ms1.size);
//加上这一句: ms1.position:=0;
ms1.Readbuffer(buff1,ms1.Size);
end;
 
感谢你这么快的回答,
试了,不行
 
怎么没有人能回答吗??
 
用TFileStream试试
 
对于1
var
buff1:pchar;
ms1:TMemoryStream;
begin
ms1:=TMemoryStream.Create;
ms1.LoadFromFile('c:/a.dat');
buff1:=stralloc(ms1.size);
ms1.Read(buff1^,ms1.Size);
end;
注意是buff1^,
其实不用这么复杂,直接用TMemoryStream.Memory属性就可以了。

对于2,不太明白你的意思,是想解密吧?不知道你遇到的难点是哪里,请说明一下。
 
delphi高级编程(是delphi 3从入门到精通的妹妹篇)
那上面的第3章专门讨论关于stream
有关于加密解密的问题
 
kyq你说的方法我试了,
如果文件中是正常的ASCII字符,如"abc"
就可以读出来,
但我的文件中包括很多乱七八糟的东西,
所以还是读不出来。
其实我的意思很简单,
你们不要管是否加/解密,
我把问题简化,
就是如何读取一个文件中的内容,
这个文件可能相当于已经编译的.exe文件一样,
有很多不可识别的字符,
至于tfilestream,tstream我都试过了,
都不行,而用二进制的方法我读出来了,
但又不知道如何把读出的所有数据赋给pchar型的变量buff1
 
这种方式就是可以操作二进制文件的。

function CycleShl(const b:Byte):Byte;//循环左移
begin
Result:=(b shl 1) or (b shr 7);
end;
function CycleShr(const b:Byte):Byte;//循环右移
begin
Result:=(b shr 1) or ((b and $1) shl 7);
end;

//加密
ms:=TMemoryStream.Create;
try
ms.LoadFromFile('c:/abc.dat');

for i:=0 to ms.Size-1 do
begin
PByteArray(ms.Memory):=CycleShl(PByteArray(ms.Memory));
end;

ms.SaveToFile('c:/abc.dat1');
finally
ms.Free;
end;
//解密
ms:=TMemoryStream.Create;
try
ms.LoadFromFile('c:/abc.dat1');
for i:=0 to ms.Size-1 do
begin
PByteArray(ms.Memory):=CycleShr(PByteArray(ms.Memory));
end;
ms.SaveToFile('c:/abc.dat2');
finally
ms.Free;
end;
 
虽然这个问题最后是我自己解决的,
但是很感谢kyq的回答
 
后退
顶部