这是为什么呢(关于流的使用)

hanxian 2003-08-25 11:10:34
var
f: Tmemorystream;
buf:Pchar;
i:Integer;
begin
GetMem(buf,10);
i:= 5;
f:= Tmemorystream.Create;
f.LoadFromFile('e:\test.rar');
f.ReadBuffer(buf^,10);
showmessage(buf);
end;
为什么显示的结果是'Rar!'啊
...全文
21 13 打赏 收藏 转发到动态 举报
写回复
用AI写文章
13 条回复
切换为时间正序
请发表友善的回复…
发表回复
hanxian 2003-08-25
  • 打赏
  • 举报
回复
一样的啦一样的啦
那两个字不会打,所以
lxpbuaa 2003-08-25
  • 打赏
  • 举报
回复
hanxian(我信誉差-别相信我) (▲▲):
“毛厕顿开”!
哈哈哈,应该是茅塞顿开。

————————————————————————————————————
宠辱不惊,看庭前花开花落,去留无意;毁誉由人,望天上云卷云舒,聚散任风。
————————————————————————————————————
hanxian 2003-08-25
  • 打赏
  • 举报
回复
12点30结贴
hanxian 2003-08-25
  • 打赏
  • 举报
回复
谢谢各位热情参与
DWGZ 2003-08-25
  • 打赏
  • 举报
回复
var
f: Tmemorystream;
buf:Pchar;
i:Integer;
begin
GetMem(buf,10);
i:= 5;
f:= Tmemorystream.Create;
f.LoadFromFile('e:\test.rar');
加上这句-------------------
f.Seek(0, 0);
-------------------------
f.ReadBuffer(buf^,10);
showmessage(buf);
lxpbuaa 2003-08-25
  • 打赏
  • 举报
回复
因为'Rar!'后面含有空字符,而PChar以空字符为结尾标记,所以读取buf时,空字符后边的字符被忽略了。

————————————————————————————————————
宠辱不惊,看庭前花开花落,去留无意;毁誉由人,望天上云卷云舒,聚散任风。
————————————————————————————————————
tonylk 2003-08-25
  • 打赏
  • 举报
回复
你读的地方是没有错,可是rar后面跟的不是可显示的字符,所以显示时不对。

一般读文件头,你要知道它的结构,自己声明一个结构体,如:
type
rarheader = record
flag:char[0..3];
other:integer;
...
end;
microjuz 2003-08-25
  • 打赏
  • 举报
回复
我是来学习的--
桂枝兄,讲讲rar文件头。。
怪不得我刚刚试了半天,f.ReadBuffer(buf^,10);后面那个数字无论多大,只要大于4都是rar!
受教了。。。
王集鹄 2003-08-25
  • 打赏
  • 举报
回复
PChar是以#0结束的,转换成String没指定长度就只能到#0的位置~~

function StringToDisplay(mString: string): string;
var
I: Integer;
S: string;
begin
Result := '';
S := '';
for I := 1 to Length(mString) do
if mString[I] in [#32..#127] then
S := S + mString[I]
else begin
if S <> '' then begin
Result := Result + QuotedStr(S);
S := '';
end;
Result := Result + Format('#$%x', [Ord(mString[I])]);
end;
if S <> '' then Result := Result + QuotedStr(S);
end; { StringToDisplay }

function BufferToString(mBuffer: PChar; mLen: Integer): string;
begin
SetLength(Result, mLen);
CopyMemory(@Result[1], mBuffer, mLen);
end; { BufferToString }

procedure TForm1.Button1Click(Sender: TObject);
var
vMemoryStream: TMemoryStream;
vBuffer: PChar;
vSize: Integer;
begin
vSize := 10;
GetMem(vBuffer, vSize);
vMemoryStream := Tmemorystream.Create;
try
vMemoryStream.LoadFromFile('c:\temp\qq.rar');
vMemoryStream.ReadBuffer(vBuffer^, vSize);
ShowMessage(StringToDisplay(BufferToString(vBuffer, vSize)));
finally
vMemoryStream.Free;
FreeMem(vBuffer, vSize);
end;
end;

//你的,方法没错~~
王集鹄 2003-08-25
  • 打赏
  • 举报
回复
00000000h: 52 61 72 21 1A 07 00 ; Rar!...
~~PChar是以#0结束的,这里已经over了~~

取是取到的,不显示出来是正确的~~
hanxian 2003-08-25
  • 打赏
  • 举报
回复
从一个流中读取其中一部份要怎么读呢,
是不是我那种读法啊
hanxian 2003-08-25
  • 打赏
  • 举报
回复
那我把读入的长度设长也是一样地,
lxpbuaa 2003-08-25
  • 打赏
  • 举报
回复
为什么不能,'Rar!'(后面还有一些空字符)是rar文件的文件头啊!

————————————————————————————————————
宠辱不惊,看庭前花开花落,去留无意;毁誉由人,望天上云卷云舒,聚散任风。
————————————————————————————————————

5,388

社区成员

发帖
与我相关
我的任务
社区描述
Delphi 开发及应用
社区管理员
  • VCL组件开发及应用社区
加入社区
  • 近7日
  • 近30日
  • 至今
社区公告
暂无公告

试试用AI创作助手写篇文章吧