大侠帮忙看段代码为什么出错啊?(20分)

  • 主题发起人 主题发起人 5411
  • 开始时间 开始时间
5

5411

Unregistered / Unconfirmed
GUEST, unregistred user!
type TransHeader = packed record
NumID:array [0..1] of char;
Ver:array [0..1] of char;
DataGrossLen:integer;
nonsymmetryClass:char;
symmetrykeyLen:smallint;
symmetryclass:char;
symmetrydataLen:integer;
TaxID:array [0..19] of char;
Reserver:array [0..7] of char;
CRC:integer;
end;


procedure TForm1.Button10Click(Sender: TObject);
var TempValue :array of byte;
dataHeader: TransHeader;
i: integer;
p: array of byte;
sl: integer;
begin
opendialog1.Execute;
ssoufilestream := TFileStream.Create(opendialog1.FileName,fmOpenRead);
ssoufilestream.Seek(0,soFromBeginning);
setlength(TempValue,ssoufilestream.Size);
ssoufilestream.Read(TempValue[0],ssoufilestream.Size); //读一段文件流
p := @dataHeader;
for i := 0 to 47 do
begin
p := tempvalue; //从读得的流中按字节,给记录类型的对象赋值.
end;

showmessage(inttostr(dataheader.symmetrykeyLen)); //此处出错,说不能读地址:<
为什么?

end;
 
p: pchar试试
 
不清楚楼上,请详细点
 
你的p是动态数组,没给它分配空间啊

其实你的p可以省略的,直接用move就可以了
 
procedure TForm1.Button10Click(Sender: TObject);
var TempValue :array of byte;
dataHeader: TransHeader;
p: ^byte;
sl: integer;
begin
opendialog1.Execute;
ssoufilestream := TFileStream.Create(opendialog1.FileName,fmOpenRead);
ssoufilestream.Seek(0,soFromBeginning);
setlength(TempValue,ssoufilestream.Size);
ssoufilestream.Read(TempValue[0],ssoufilestream.Size);
p := @dataHeader;
move(tempvalue,p,48);
showmessage(inttostr(dataheader.symmetrykeyLen));
end;

这样吗?也出一样错啊:<
 
setlength(p,Sizeof(dataHeader));
p := @dataHeader;
 
procedure TForm1.Button10Click(Sender: TObject);
var TempValue :array of byte;
dataHeader: TransHeader;
p: array of byte;
begin
opendialog1.Execute;
ssoufilestream := TFileStream.Create(opendialog1.FileName,fmOpenRead);
ssoufilestream.Seek(0,soFromBeginning);
setlength(TempValue,ssoufilestream.Size);
ssoufilestream.Read(TempValue[0],ssoufilestream.Size);
setlength(p,Sizeof(dataHeader));
p := @dataHeader;
move(tempvalue,p,48);
showmessage(inttostr(dataheader.symmetrykeyLen));
end;

这个样子也不对啊
 
p: pchar;

CopyMemory(p, @tempvalue[0], 48);
 
嘛意思,楼上大侠,你的没错,但取出来的数不对.
 
那就顺道帮忙看下写的吧.
procedure TForm1.adddataheader;
var
Header: TransHeader;
p: ^char;
i: integer;
begin
Header.NumID := 'RZ';
byte(Header.Ver[0]) := $01;
byte(Header.Ver[1]) := $00;
Header.DataGrossLen := sizeof(edit3.Text) + sizeof(memo1.Text) + 48;
Header.nonsymmetryClass := '1';
Header.symmetrykeyLen := sizeof(memo1.Text);
Header.symmetryclass := '1';
Header.symmetrydataLen := sizeof(edit3.Text);
Header.TaxID := '23498723482938472872';
//CRC校验和
Header.CRC := 0; //不会
p := @Header;
sdesfilestream.Seek(0, soFromBeginning);
sdesfilestream.Write(p, 48) ;
end;
 
你直接
move(dataheader,tempvalue[0],sizeof(dataHeader));就可以了啊
不需要p的

而且p := @dataHeader;只是让p指向你dataheader的位置,如果之前你把dataheader赋个值什么的就不会有问题了
dataheader.symmetrykeyLen := 0;都可以
 
数不对?不太可能吧?数是多少?原来应该是多少?
不知道你定义p干嘛用。可以CopyMemory(@dataHeader, @tempvalue[0], 48);
 
来风大侠的也不报错.
 
来风大侠和waterspace大侠都不报错,同一个文件,但你俩取的值不一样,嘛意思?:>
要不你俩先勾通一下?:>
玩笑啊.别生气!
赋值在这里,帮忙看下啊
那就顺道帮忙看下写的吧.
procedure TForm1.adddataheader;
var
Header: TransHeader;
p: ^char;
i: integer;
begin
Header.NumID := 'RZ';
byte(Header.Ver[0]) := $01;
byte(Header.Ver[1]) := $00;
Header.DataGrossLen := sizeof(edit3.Text) + sizeof(memo1.Text) + 48;
Header.nonsymmetryClass := '1';
Header.symmetrykeyLen := sizeof(memo1.Text);
Header.symmetryclass := '1';
Header.symmetrydataLen := sizeof(edit3.Text);
Header.TaxID := '23498723482938472872';
//CRC校验和
Header.CRC := 0; //不会
p := @Header;
sdesfilestream.Seek(0, soFromBeginning);
sdesfilestream.Write(p, 48) ;
end;
 
sdesfilestream.Write(p[0], 48) ;
 
不过不知道你什么意思,sizeof(edit3.Text)=4,你是想得到4吗?
 
sdesfilestream.Write(p[0], 48) ;
请问,那应该怎么写?
 
if edit3.text等于4的话,我就想要4.
 
就是这句sdesfilestream.Write(p, 48) 改成sdesfilestream.Write(p[0], 48),不过最好改成sdesfilestream.Write(Header, 48);
我手头没有delphi可用,可能有点出入。Tstream.write原型应该是Tstream.write(untype, integer)吧?不是要pointer。
ssoufilestream.Read(TempValue[0],ssoufilestream.Size); 这句你不是就写对了吗?
 
谢谢你呵,我试试.
 
后退
顶部