PChar字符串按字节分别取数据问题(急)(200分)

  • 主题发起人 主题发起人 aiHis
  • 开始时间 开始时间
A

aiHis

Unregistered / Unconfirmed
GUEST, unregistred user!
有一个PChar的字符串,以Integer(固定4个字节)、Double(固定8个字节)、字符串(先存放该串长度,接着存放字符串内容)方式组合的,请问怎么取出PChar串中的Integer、Double、String的值?
在线等待。。。。。
 
把它转换成String 在用字符串函数截取不就可以了吗。
 
各位富翁们,小弟真急呀。。我还有点分不够在加200分。
 
to:kk2000
能不能具体点,若取Integer的值,用字符串函数怎么截取?谢谢!!!
 
procedure TForm1.Button1Click(Sender: TObject);
type
prec=^Trec;
trec=packed record
i:integer;
n:Double;
ilength:integer;
s:char;
end;
var
a:pchar;
b:array[0..100] of char;
rec1:PRec;
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;
 
你要保存一个窗体内所有的控件以及控件内的文本?
 
var
msg:PChar;
tmp:String;
i:Integer;
d: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;
 
procedure TForm1.Button1Click(Sender: TObject);
type
prec=^Trec;
trec=packed record
i:integer;
n:Double;
ilength:integer;
s:char;///少了个P,应该是PCHAR ^^
end;
var
a:pchar;
b:array[0..100] of char;
rec1:PRec;
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,的办法很好,分给他就中了.
 
to:k8nt2k
你的是字符串截取,并非按字节,如果Integer的长度不是四个,还能用嘛?
 
to:aiHis
我有源码可以满足你的要求,但是做法不同,我是
控件名]文本 as stream to save
不知道你需要否?
 
先把PChar的字符串保存为流。
流可以按需求任意读取字节
 
to 网中戏
我就是这样处理的!
 
to:chuwenyong,_Murray
小弟是初学,不知道我理解错误没有,实际你们说的是如何存取问题。我想要的是:
有一个PChar字符串如下:
'1234567897.1210HelloWord!',我只知道123456789是integer的,国定长度为4个字节,
7.12为Double,8个字节,10为字符串‘HelloWord!’的长度,而HelloWord!为string 的,我取分别取出,而长度不国定。
(补充说明一下:要读取的PChar串是别人提供的,不是我自己写的,用Record形式读取我不明白)

to:清新空气
谢谢,lz_zzd@126.com,方便的话也可以贴出来,大家一起学习。。。
 
呵呵,上面的源码大都是要再拷贝什么的,我的意思是直接访问,用指针的方式,加上强制类型转换即可访问,不需别的内存开销。

比如p:pchar ; p也是个指针,比如第五个字节开始存放的是integer;
则用offset:=5-1; 这个integer 的值就是 integer(pointer(integer(p)+offset)^);
以此类推,可随意读出任何位置的任何类型的值,只要offset变动响应的值即可
 
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
 
P:='121233.14hello';

就这句话楼主你自己知道这个integer是多少?double是多少??

可能的情况太多了,你这是非标准的
 
楼主啊,原来你这都不明白?你的是字符串'12123',怎么可能强制转换嘛。

算了,我怕费劲,不在帖子里回了。找不到答案的话,点我的名字,直接联系我吧。
 
不明白你要干吗!
比如'1234567897.1210HelloWord!'
你说你知道123456789是整数,我怎么看不出来。为什么不是123是整数,而4567897.12是Double?
你开始时讲‘Integer(固定4个字节)、Double(固定8个字节)’中的‘固定’何解?
 
chuwenyong 的方法是正确的,但要注意得出的字符串可能里含有非可视字符。因为整数和double都是直接存放,而不是通过inttostr, floattostr转换为字符串后再存放的。
你把实际用途说出来,大家再帮你出主意。
 
谢谢大伙。。。
chuwenyong的方法确实是正确的。
 
后退
顶部