请问,如何把一个指针所指的内容赋值给一个动态数组?(200分)

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

apacheii

Unregistered / Unconfirmed
GUEST, unregistred user!
指针所指的内容为一段二进制数据,动态数组的申明为Byte类型,我如何才能把指针所指的这段二进制数据复制到动态数组中去?以下是示列代码:
procedure myproc(Data:Pointer
Size:Dword);
//Size事先已经确定,Data为一段二进制数据的指针
var
vBin:array of Byte;
begin
SetLength(vBin, Size)
//在这里为动态数组分配内存
问题:如何才能把Data的内容赋值给vBin?
SetLength(vBin, 0)
//释放动态数组
end;

另,不能使用Data^[1]这样的方式来访问Data里的内容单体,要用怎样的方式才能正常访问?
 
procedure myproc(Data:Pointer
Size:Dword);
//Size事先已经确定,Data为一段二进制数据的指针
var
vBin:array of Byte;
begin
SetLength(vBin, Size)
//在这里为动态数组分配内存
//问题:如何才能把Data的内容赋值给vBin?
Move(Pchar(Data)^, vBin[0],Size)
//内存拷贝,把指针所指内容复制到数组使用的是Delphi RTL函数
//或者这样也可以CopyMemory(@vBin[0],Data, Size);//内存拷贝,把指针所指内容复制到数组使用的是Windows API函数
SetLength(vBin, 0)
//释放动态数组
end;
访问Data的内容只能是
Pbyte(Data)^是第一个元素
Inc(Pbyte(Data));把指针向后移动一个Byte大小
Pbyte(Data)^是第二个元素
 
试了一下,迟了!楼上说完了,不留一点漏洞
二进制数据用PByte哦忘了和Pchar一样..
move(PByte(pData)^, vBin[0], size)

指针访问如楼上所说
因为delphi不允许对无类型的指针进行加减
所以你要强制转换为PByte,然后进行加减就是了
也就是地址加减和c一样
 
wr960204回答得好啊
 
我就知道使用move,顺便来了解一下PByte,借了楼主的光了,呵呵
 
嘿嘿,其实用copymemory有何不可,最是直观。
 
CopyMemory(@vBin[0],Data, Size);
~~~
这里为什么要有个0?

CopyMemory我也试过,就因为没有加那个“0”老是出错。。。。。。。
 
上面已经回答完了,随便提示楼主一下,如果是strng 类型,可就不是从0位开始的了.

是从1开始的.真的没有什么可说的了.(因为你刚才说你忘加0 了,所以给此提示),呵呵
 
声明vBin只是分配的一个指向数据块的指针
并不实际分配内存
只有setlength之后,才分配数据块内存
vBin只是指向数据块的指针,而vBin[0]才是真正的数据块地址
所以,就不用说了吧
http://www.delphibbs.com/delphibbs/dispq.asp?lid=3361299
里面有我写的动态数组的示例代码
 
原来如此!了解,谢谢。
 
后退
顶部