procedure TForm4.Button1Click(Sender: TObject); var //动态数组 bytes1,bytes2: TBytes; //静态数组 bytes3,bytes4: array[0..5] of Byte; i: Integer; abc: string; begin //初始化赋值 abc := 'ab好'; bytes1 := WideBytesOf(abc); for I := 0 to 5 do begin bytes3[I] := I; end; { 根据我的猜测delphi内部最终是拿到了数组首元素的内存编号 (静态数组变量本身就是,动态数组的话传递首元素的值(要解密得解开汇编代码)) 结论:最终move函数的前两个参数的内部的汇编代码,可能就是拿到堆中数据首元素的内存编号 } //1.动态数组复制到动态数组(规定:前两个参数传递数组首元素的值) SetLength(bytes2, Length(bytes1)); Move(bytes1[0], bytes2[0], Length(bytes1)); //2.动态数组复制到静态态数组(两种写法都可以为了与动态数组统一,推荐用[0]的方法) Move(bytes1[0], bytes3[0], Length(bytes1)); //Move(bytes1[0], bytes3, Length(bytes1)); //3.静态数组复制到静态态数组(两种写法都可以为了与动态数组统一,推荐用[0]的方法) Move(bytes3[0], bytes4[0], Length(bytes3)); //Move(bytes3, bytes4, Length(bytes3)); end; procedure testByte(b: Byte); var pp: Pointer; begin //如果是普通函数的话,你会发现是值传递,但是move函数的原型 windows下是汇编,所以不会按常规出牌. //与Pointer(@b1[0]);不同 pp := Pointer(b); end; procedure TForm4.Button2Click(Sender: TObject); var bs: TBytes; begin bs := BytesOf('abc'); testByte(bs[0]); end; procedure TForm4.Button3Click(Sender: TObject); var b1: TBytes; p1,p2,p3,p4: Pointer; begin b1 := BytesOf('abc'); p1 := Pointer(b1);//栈中内存的值即堆中的地址 p2 := Pointer(@b1[0]);//首元素的地址就是变量本身,同Pointer(b1)一样(我猜测move函数让传入 b1[0],其实他内部就是拿到堆中数据首元素的地址) p3 := Pointer(b1[0]);//首个元素的值转成了pointer类型 p4 := Pointer(Pbyte(b1)^);//首元素的值转成了pointer类型.$61 = 1 + 16 * 6 = 97(a) end;
知识点1:
静态数组与动态数组的内存存储是不同的,静态数组仅存在于栈内 或 仅存在于堆内,就是说是没有 栈中指针 堆中数据这个说法的。
而动态数组是栈中存变量指针,堆中存数据的。
知识点2:
bytesof是把字符串中的值转成ascii码表中的10进制值来表示的,因为毕竟Byte是整型嘛;
wideBytesof 是转成双字节的,若是英文的话,双字节中的第一个字节存值,第二个字节填充为0;中文的话 就是unicode编码 两个字节肯定都有值的。
知识点3:
静态数组为什么这两句写法都行,move函数的2个参数是需要传递数据的首元素的值,我猜测最终的目的是拿到堆中数据首元素的内存编号。对于静态数组而言,数组变量本身就是数据的起始指针。
而对于动态数据而言,bytes1(栈中内存块数据--也可以叫做栈中指针),@bytes1[0] 就是堆中数据的起始地址了;元素首元素的地址 就是 变量本身;
知识点4:
move其实也是copy内存,我猜想copy的话 应该比 转移更快的原因,因为转移的话 就是 拿走后 还得销毁 浪费时间。因为出栈后 程序会自动销毁,所以干嘛不复制呢。
关于群里的讨论:太长略了,结论:
无论静态数组还是动态数组都这样玩(带[0]),保证没错。
Move(bytes1[0], bytes2[0], Length(bytes1));
本文来自博客园,作者:del88,转载请注明原文链接:https://www.cnblogs.com/del88/p/6617308.html
分类:
delphi内部函数
【推荐】国内首个AI IDE,深度理解中文开发场景,立即下载体验Trae
【推荐】编程新体验,更懂你的AI,立即体验豆包MarsCode编程助手
【推荐】抖音旗下AI助手豆包,你的智能百科全书,全免费不限次数
【推荐】轻量又高性能的 SSH 工具 IShell:AI 加持,快人一步
· AI与.NET技术实操系列:向量存储与相似性搜索在 .NET 中的实现
· 基于Microsoft.Extensions.AI核心库实现RAG应用
· Linux系列:如何用heaptrack跟踪.NET程序的非托管内存泄露
· 开发者必知的日志记录最佳实践
· SQL Server 2025 AI相关能力初探
· winform 绘制太阳,地球,月球 运作规律
· 震惊!C++程序真的从main开始吗?99%的程序员都答错了
· 【硬核科普】Trae如何「偷看」你的代码?零基础破解AI编程运行原理
· AI与.NET技术实操系列(五):向量存储与相似性搜索在 .NET 中的实现
· 超详细:普通电脑也行Windows部署deepseek R1训练数据并当服务器共享给他人