A aiHis Unregistered / Unconfirmed GUEST, unregistred user! 2006-05-19 #1 有一个PChar的字符串,以Integer(固定4个字节)、Double(固定8个字节)、字符串(先存放该串长度,接着存放字符串内容)方式组合的,请问怎么取出PChar串中的Integer、Double、String的值? 在线等待。。。。。
有一个PChar的字符串,以Integer(固定4个字节)、Double(固定8个字节)、字符串(先存放该串长度,接着存放字符串内容)方式组合的,请问怎么取出PChar串中的Integer、Double、String的值? 在线等待。。。。。
K kk2000 Unregistered / Unconfirmed GUEST, unregistred user! 2006-05-19 #2 把它转换成String 在用字符串函数截取不就可以了吗。
A aiHis Unregistered / Unconfirmed GUEST, unregistred user! 2006-05-19 #3 各位富翁们,小弟真急呀。。我还有点分不够在加200分。
A aiHis Unregistered / Unconfirmed GUEST, unregistred user! 2006-05-19 #4 to:kk2000 能不能具体点,若取Integer的值,用字符串函数怎么截取?谢谢!!!
C chuwenyong Unregistered / Unconfirmed GUEST, unregistred user! 2006-05-19 #5 procedure TForm1.Button1Click(Sender: TObject); type prec=^Trec; trec=packed record i:integer; nouble; ilength:integer; s:char; end; var achar; b:array[0..100] of char; rec1Rec; s:array of char; begin a:=@b[0]; Rec1:= Pointer(a); rec1.i:= 100; rec1.n:= 3.001; rec1.ilength:= Length(Edit1.Text); StrPCopy(@rec1.s,Edit1.Text); SetLength(s,rec1.ilength+1); CopyMemory(s,@rec1.s,rec1.ilength); s[rec1.ilength]:= #0; ShowMessage(PChar(s)); s:= nil; end;
procedure TForm1.Button1Click(Sender: TObject); type prec=^Trec; trec=packed record i:integer; nouble; ilength:integer; s:char; end; var achar; b:array[0..100] of char; rec1Rec; s:array of char; begin a:=@b[0]; Rec1:= Pointer(a); rec1.i:= 100; rec1.n:= 3.001; rec1.ilength:= Length(Edit1.Text); StrPCopy(@rec1.s,Edit1.Text); SetLength(s,rec1.ilength+1); CopyMemory(s,@rec1.s,rec1.ilength); s[rec1.ilength]:= #0; ShowMessage(PChar(s)); s:= nil; end;
K k8nt2k Unregistered / Unconfirmed GUEST, unregistred user! 2006-05-19 #7 var msgChar; tmp:String; i:Integer; double; s:String; begin msg := '012300003.14hello'; tmp:=String(msg); i := StrToInt(Copy(tmp,1,4)); d := StrToFloat(Copy(tmp,5,8)); s := Copy(tmp,13,Length(tmp)-13); end;
var msgChar; tmp:String; i:Integer; double; s:String; begin msg := '012300003.14hello'; tmp:=String(msg); i := StrToInt(Copy(tmp,1,4)); d := StrToFloat(Copy(tmp,5,8)); s := Copy(tmp,13,Length(tmp)-13); end;
M _Murray Unregistered / Unconfirmed GUEST, unregistred user! 2006-05-19 #8 procedure TForm1.Button1Click(Sender: TObject); type prec=^Trec; trec=packed record i:integer; nouble; ilength:integer; s:char;///少了个P,应该是PCHAR ^^ end; var achar; b:array[0..100] of char; rec1Rec; s:array of char; begin a:=@b[0]; Rec1:= Pointer(a); rec1.i:= 100; rec1.n:= 3.001; rec1.ilength:= Length(Edit1.Text); StrPCopy(@rec1.s,Edit1.Text); SetLength(s,rec1.ilength+1); CopyMemory(s,@rec1.s,rec1.ilength); s[rec1.ilength]:= #0; ShowMessage(PChar(s)); s:= nil; end; chuwenyong,的办法很好,分给他就中了.
procedure TForm1.Button1Click(Sender: TObject); type prec=^Trec; trec=packed record i:integer; nouble; ilength:integer; s:char;///少了个P,应该是PCHAR ^^ end; var achar; b:array[0..100] of char; rec1Rec; s:array of char; begin a:=@b[0]; Rec1:= Pointer(a); rec1.i:= 100; rec1.n:= 3.001; rec1.ilength:= Length(Edit1.Text); StrPCopy(@rec1.s,Edit1.Text); SetLength(s,rec1.ilength+1); CopyMemory(s,@rec1.s,rec1.ilength); s[rec1.ilength]:= #0; ShowMessage(PChar(s)); s:= nil; end; chuwenyong,的办法很好,分给他就中了.
A aiHis Unregistered / Unconfirmed GUEST, unregistred user! 2006-05-19 #9 to:k8nt2k 你的是字符串截取,并非按字节,如果Integer的长度不是四个,还能用嘛?
清 清新空气 Unregistered / Unconfirmed GUEST, unregistred user! 2006-05-19 #10 to:aiHis 我有源码可以满足你的要求,但是做法不同,我是 控件名]文本 as stream to save 不知道你需要否?
网 网中戏 Unregistered / Unconfirmed GUEST, unregistred user! 2006-05-19 #11 先把PChar的字符串保存为流。 流可以按需求任意读取字节
A aiHis Unregistered / Unconfirmed GUEST, unregistred user! 2006-05-19 #13 to:chuwenyong,_Murray 小弟是初学,不知道我理解错误没有,实际你们说的是如何存取问题。我想要的是: 有一个PChar字符串如下: '1234567897.1210HelloWord!',我只知道123456789是integer的,国定长度为4个字节, 7.12为Double,8个字节,10为字符串‘HelloWord!’的长度,而HelloWord!为string 的,我取分别取出,而长度不国定。 (补充说明一下:要读取的PChar串是别人提供的,不是我自己写的,用Record形式读取我不明白) to:清新空气 谢谢,lz_zzd@126.com,方便的话也可以贴出来,大家一起学习。。。
to:chuwenyong,_Murray 小弟是初学,不知道我理解错误没有,实际你们说的是如何存取问题。我想要的是: 有一个PChar字符串如下: '1234567897.1210HelloWord!',我只知道123456789是integer的,国定长度为4个字节, 7.12为Double,8个字节,10为字符串‘HelloWord!’的长度,而HelloWord!为string 的,我取分别取出,而长度不国定。 (补充说明一下:要读取的PChar串是别人提供的,不是我自己写的,用Record形式读取我不明白) to:清新空气 谢谢,lz_zzd@126.com,方便的话也可以贴出来,大家一起学习。。。
S shangshang Unregistered / Unconfirmed GUEST, unregistred user! 2006-05-19 #14 呵呵,上面的源码大都是要再拷贝什么的,我的意思是直接访问,用指针的方式,加上强制类型转换即可访问,不需别的内存开销。 比如pchar ; p也是个指针,比如第五个字节开始存放的是integer; 则用offset:=5-1; 这个integer 的值就是 integer(pointer(integer(p)+offset)^); 以此类推,可随意读出任何位置的任何类型的值,只要offset变动响应的值即可
呵呵,上面的源码大都是要再拷贝什么的,我的意思是直接访问,用指针的方式,加上强制类型转换即可访问,不需别的内存开销。 比如pchar ; p也是个指针,比如第五个字节开始存放的是integer; 则用offset:=5-1; 这个integer 的值就是 integer(pointer(integer(p)+offset)^); 以此类推,可随意读出任何位置的任何类型的值,只要offset变动响应的值即可
A aiHis Unregistered / Unconfirmed GUEST, unregistred user! 2006-05-19 #15 to:shangshang var I: Integer; P: PChar; begin //ShowMessage('P='+IntToStr(Integer(@P))); P:='12123gggg3.14hello'; I:=Integer(Pointer(Integer(P))^); ShowMessage(IntToStr(I)); end; I的值=842084913,为什么不等于12123
to:shangshang var I: Integer; P: PChar; begin //ShowMessage('P='+IntToStr(Integer(@P))); P:='12123gggg3.14hello'; I:=Integer(Pointer(Integer(P))^); ShowMessage(IntToStr(I)); end; I的值=842084913,为什么不等于12123
来 来如风 Unregistered / Unconfirmed GUEST, unregistred user! 2006-05-19 #16 P:='121233.14hello'; 就这句话楼主你自己知道这个integer是多少?double是多少?? 可能的情况太多了,你这是非标准的
S shangshang Unregistered / Unconfirmed GUEST, unregistred user! 2006-05-19 #17 楼主啊,原来你这都不明白?你的是字符串'12123',怎么可能强制转换嘛。 算了,我怕费劲,不在帖子里回了。找不到答案的话,点我的名字,直接联系我吧。
K k8nt2k Unregistered / Unconfirmed GUEST, unregistred user! 2006-05-19 #18 不明白你要干吗! 比如'1234567897.1210HelloWord!' 你说你知道123456789是整数,我怎么看不出来。为什么不是123是整数,而4567897.12是Double? 你开始时讲‘Integer(固定4个字节)、Double(固定8个字节)’中的‘固定’何解?
不明白你要干吗! 比如'1234567897.1210HelloWord!' 你说你知道123456789是整数,我怎么看不出来。为什么不是123是整数,而4567897.12是Double? 你开始时讲‘Integer(固定4个字节)、Double(固定8个字节)’中的‘固定’何解?
K kaida Unregistered / Unconfirmed GUEST, unregistred user! 2006-05-19 #19 chuwenyong 的方法是正确的,但要注意得出的字符串可能里含有非可视字符。因为整数和double都是直接存放,而不是通过inttostr, floattostr转换为字符串后再存放的。 你把实际用途说出来,大家再帮你出主意。
chuwenyong 的方法是正确的,但要注意得出的字符串可能里含有非可视字符。因为整数和double都是直接存放,而不是通过inttostr, floattostr转换为字符串后再存放的。 你把实际用途说出来,大家再帮你出主意。
A aiHis Unregistered / Unconfirmed GUEST, unregistred user! 2006-05-19 #20 谢谢大伙。。。 chuwenyong的方法确实是正确的。