如何把一个PChar变量指向的字符串保存到二进制文件里,又怎样从二进制文件读出它?

时间:2022-12-01 20:16:13
我的程序调用别人开发的dll,因dll系VC开发,故变量大多为PChar。
其中有几个PChar是作为最后的结果输出,有几百个字节(确切长度已知),我需要把这些结果保存到文件里,试用了blockwrite方法如下:
………………………………
        Assignfile(file_name,'der_pkcs10.cer');  //'der_pkcs10.cer'为欲保存的文件名
        Rewrite(file_name,der_pkcs10Size^);      //der_pkcs10Size为包含输出结果大小的PInteger变量
        blockwrite(file_name,der_pkcs10^,1);     //der_pkcs10为包含输出结果的PChar变量
        closefile(file_name);

好像写出来的文件格式不对的,本来.cer是windows的证书文件,可是windows说文件无效,无法打开,我拿UltraEdit比较了我生成的.cer和windows导出的正确cer文件,发现除开始两个字节以外都不一样。

另外,当我这样保存了一个文件以后(先不管文件到底正确与否),使用中需要再从文件中读出内容送给另外的验证程序,验证程序的输入也是一个PChar变量,怎样读出来文件内容送给这个PChar变量呢?我又试用了blockread的方法如下:
  assignfile(tempfile,'der_pkcs10.cer');
  der_pkcs10Size:=sizeof(tempfile);
  reset(tempfile,der_pkcs10Size);
  blockread(tempfile,der_pkcs10,1);
  closefile(tempfile);
这里的der_pkcs10变量是PChar类型,同样是作为保存证书的内容,可是我一运行这段程序就会非法内存操作,同时跳出CPU view窗口,该怎样正确读取呢?

9 个解决方案

#1


把 der_pkcs10Size^ 改成 der_pkcs10Size,去掉“^”

#2


不行啊,der_pkcs10Size是个PInteger类型的变量,去掉“^”的话编译器就会报错了,提示Incompatible types!!!

#3


把 der_pkcs10Size^ 改成 der_pkcs10Size[0]
assignfile(tempfile,'der_pkcs10.cer');
  der_pkcs10Size:=得到文件长度;
  reset(tempfile,der_pkcs10Size);
  strnew(der_pkcs10,der_pkcs10Size);
  blockread(tempfile,der_pkcs10,1);
  strdispose(der_pkcs10,der_pkcs10Size);
  closefile(tempfile);

#4


example
var p:pchar;
    f:file ;
    len:integer;
begin
   p:='12345';
   assignfile(f,'c:\test.dat');
   rewrite(f,1);
   blockwrite(f,p^,strlen(p));
   closefile(f);
   assignfile(f,'c:\test.dat');
   reset(f,1);
   len:=filesize(f);
   p:=StrAlloc(len+1);
   blockread(f,p^,len);
   p[len]:=#0;
   closefile(f);
   strdispose(p);

end;
//p^=p[0]

#5


谢谢zjqyb,你的两个回复都是说读取文件,但是第一个里面提到的“把 der_pkcs10Size^ 改成 der_pkcs10Size[0]”是说写文件时要改的吗?der_pkcs10Size是PInteger,但是der_pkcs10Size[0]是char类型的,编译器还是会说类型不匹配啊

#6


OK,使用zjqyb给的example已经可以成功读写二进制文件,谢谢你的帮助。不过我对你的第一个回复仍不理解,“把 der_pkcs10Size^ 改成 der_pkcs10Size[0]”是什么意思?还有strnew函数只能带一个参数啊!!

#7


在结帖前能否再解释一下?
^_^

#8


der_pkcs10Size^ =der_pkcs10Size[0]

#9


哦^_^

#1


把 der_pkcs10Size^ 改成 der_pkcs10Size,去掉“^”

#2


不行啊,der_pkcs10Size是个PInteger类型的变量,去掉“^”的话编译器就会报错了,提示Incompatible types!!!

#3


把 der_pkcs10Size^ 改成 der_pkcs10Size[0]
assignfile(tempfile,'der_pkcs10.cer');
  der_pkcs10Size:=得到文件长度;
  reset(tempfile,der_pkcs10Size);
  strnew(der_pkcs10,der_pkcs10Size);
  blockread(tempfile,der_pkcs10,1);
  strdispose(der_pkcs10,der_pkcs10Size);
  closefile(tempfile);

#4


example
var p:pchar;
    f:file ;
    len:integer;
begin
   p:='12345';
   assignfile(f,'c:\test.dat');
   rewrite(f,1);
   blockwrite(f,p^,strlen(p));
   closefile(f);
   assignfile(f,'c:\test.dat');
   reset(f,1);
   len:=filesize(f);
   p:=StrAlloc(len+1);
   blockread(f,p^,len);
   p[len]:=#0;
   closefile(f);
   strdispose(p);

end;
//p^=p[0]

#5


谢谢zjqyb,你的两个回复都是说读取文件,但是第一个里面提到的“把 der_pkcs10Size^ 改成 der_pkcs10Size[0]”是说写文件时要改的吗?der_pkcs10Size是PInteger,但是der_pkcs10Size[0]是char类型的,编译器还是会说类型不匹配啊

#6


OK,使用zjqyb给的example已经可以成功读写二进制文件,谢谢你的帮助。不过我对你的第一个回复仍不理解,“把 der_pkcs10Size^ 改成 der_pkcs10Size[0]”是什么意思?还有strnew函数只能带一个参数啊!!

#7


在结帖前能否再解释一下?
^_^

#8


der_pkcs10Size^ =der_pkcs10Size[0]

#9


哦^_^