当前位置:主页>仓库管理软件> 列表

请问,如何把一个指针所指的内容赋值给一个动态数组? 找速达软件大管家

销售管理软件版1楼: 指针所指的内容为一段二进制数据,动态数组的申明为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里的内容单体,要用怎样的方式才能正常访问?

2楼: 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)^是第二个元素 如速达软件大管家

3楼: 试了一下,迟了!楼上说完了,不留一点漏洞
二进制数据用PByte哦忘了和Pchar一样..
move(PByte(pData)^, vBin[0], size);
指针访问如楼上所说
因为delphi不允许对无类型的指针进行加减
所以你要强制转换为PByte,然后进行加减就是了
也就是地址加减和c一样

4楼: wr960204回答得好啊

5楼: 我就知道使用move,顺便来了解一下PByte,借了楼主的光了,呵呵

6楼: 嘿嘿,其实用copymemory有何不可,最是直观。

销售管理软件版7楼: CopyMemory(@vBin[0],Data, Size);
~~~
这里为什么要有个0?

CopyMemory我也试过,就因为没有加那个“0”老是出错。。。。。。。

8楼: 上面已经回答完了,随便提示楼主一下,如果是strng 类型,可就不是从0位开始的了.

是从1开始的.真的没有什么可说的了.(因为你刚才说你忘加0 了,所以给此提示),呵呵

9楼: 声明vBin只是分配的一个指向数据块的指针
并不实际分配内存
只有setlength之后,才分配数据块内存
vBin只是指向数据块的指针,而vBin[0]才是真正的数据块地址
所以,就不用说了吧
http://www.delphibbs.com/delphibbs/dispq.asp?lid=3361299
里面有我写的动态数组的示例代码

10楼: 原来如此!了解,谢谢。