所有分数求助,Delphi的指针和Pchar问题

echoxh 2005-06-27 02:39:29
已知某个指针Buffer:Pointer,以及这个指针所指向数据的长度BufferLength:Word,我一直是使用一个Pchar类型的变量接受该指针指向的数据,然后直接赋值给String类型的变量,如下:
P:Pchar;
S:String;

begin
P:=Buffer;
S:=P;
end;

现在我发现,当指针指向的内容比较多时,好象在S那里得到的字符串长度没有那么多,谁能帮忙指点一下吗?分数不多,只有这么多了,请原谅。
...全文
265 12 打赏 收藏 转发到动态 举报
写回复
用AI写文章
12 条回复
切换为时间正序
请发表友善的回复…
发表回复
hzwmjl 2005-07-06
  • 打赏
  • 举报
回复
欢迎加入DELPHI 程序员群 1805366 参加技术讨论 !!
echoxh 2005-07-06
  • 打赏
  • 举报
回复
procedure TFormMain.Comm1ReceiveData(Sender: TObject; Buffer: Pointer;
BufferLength: Word);
var s:string;
begin
SetLength(s,BufferLength);
move(buffer^,pchar(s[1])^,bufferlength);
showmessage(s);
end

几位大侠,不知道我这样写的是不是能对呢,但实际上我这样运行的时候,执行到Move那一句的时候,会提示“Access violation ad address ……”这类的错误,使用Pchar(Buffer)^也会出现这种提示,是不是我哪的语法还不对呢?
xinqingbucuo 2005-06-29
  • 打赏
  • 举报
回复
setlength(s,bufferlength);
move(pchar(buffer^),pchar(s[1])^,bufferlength);
s可以使string型也可以是 :array of byte;
erace992001 2005-06-29
  • 打赏
  • 举报
回复
我觉得直接MOVE(S[1],Buff^,BufferLen)可以吧,不过得先给S分配内存
  • 打赏
  • 举报
回复
其实可以直接用一个接收结构体去套用的,发送的数据都是遵循一定的排列规则的,比如第一个字节发送的是协议版本号,第二个字节发送的是总的长度等等,我们这里假设结构体如下
TBuff=record
version:byte;
length:byte;
data:array[1..1024] of Char;
end;
PBuff=^TBuff;


var Buff:Pbuff;


Buff:=Buffer;
然后就可以调用了
buff.version
小呆之家 2005-06-27
  • 打赏
  • 举报
回复
var
s:string;

move(pchar(buffer^),pchar(s[1])^,bufferlength);
beyondtkl 2005-06-27
  • 打赏
  • 举报
回复
procedure TFormMain.Comm1ReceiveData(Sender: TObject; Buffer: Pointer;
BufferLength: Word);
var
pbtBuf: PBYTE;

begin
// P;=Buffer;
// ReceiveData := P;
..
对字符串ReceiveData的操作
..
GetMem(pbtBuf, BufferLength + 1);
CopyMemory(pbtBuf, Buffer, BufferLength);
// 现在数据到了 pbtBuf中了 不要用string转换 直接读取 比如用循环进行读取之类的。。
end;

echoxh 2005-06-27
  • 打赏
  • 举报
回复
procedure TFormMain.Comm1ReceiveData(Sender: TObject; Buffer: Pointer;
BufferLength: Word);
var ReceiveData:string;
P;Pchar;
begin
P;=Buffer;
ReceiveData := P;
..
对字符串ReceiveData的操作
..
end;

看了大侠的贴子,有点似懂非懂,我是初学者,能否请大侠看看这个代码,帮帮忙改写一下,好吗?谢谢
beyondtkl 2005-06-27
  • 打赏
  • 举报
回复
不使用 字符串

使用 byte数组之类的 然后使用
CopyMemory 之类的API函数。。。 进行拷贝

VOID CopyMemory(
PVOID Destination, // pointer to address of copy destination
CONST VOID *Source, // pointer to address of block to copy
DWORD Length // size, in bytes, of block to copy
);

最后一个 就是你的 BufferLength, 然后你直接读取 Destination 里面的值即可 注意不要越界就是 这里也需要这个 BufferLength
echoxh 2005-06-27
  • 打赏
  • 举报
回复
两位大哥说的都对,不过我现在是使用这个东西接收无线Modem收到的短信,中文短信采用了Unicode编码方式,确实是使用了#0作为结尾的。

问题已经知道原因了,如何解决呢,有没有办法使用上那个BufferLength的值呢,还请大侠明示
何鲁青 2005-06-27
  • 打赏
  • 举报
回复
遇到0结束的问题……
beyondtkl 2005-06-27
  • 打赏
  • 举报
回复
string 以 \0, #0 为字符串终结符 虽然Buffer里面 可能比较多
但是 S := P; 后 当系统遇到也只有遇到 \0, #0终结符时,才认为这个字符创结束 然后S的值就是所有前面这些。。

16,748

社区成员

发帖
与我相关
我的任务
社区描述
Delphi 语言基础/算法/系统设计
社区管理员
  • 语言基础/算法/系统设计社区
加入社区
  • 近7日
  • 近30日
  • 至今
社区公告
暂无公告

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