关于动态数组、静态数组转换为字符串的一些问题 - 给 "厨师" 的回复

本文详细探讨了在Pascal或Delphi中字符数组如何转换为字符串类型,包括静态数组和动态数组的不同处理方式,并深入解析了动态数组的内部结构。
问题来源: http://www.cnblogs.com/del/archive/2008/05/21/1192113.html#1204252

首先, 只有字符类型的数组才可以直接转换为字符串!
//这是静态数组的例子:
var
  Arr: array[0..9] of Char;
  s: string;
  p: PChar;
  i: Integer;
begin
  {给 Arr 赋值: A B C D E F G H I J}
  for i := Low(Arr) to High(Arr) do
    Arr[i] := Chr(65+i);

  {把 Char 数组赋给 string}
  s := Arr;
  ShowMessage(s); {ABCDEFGHIJ}

  {把 Char 数组赋给 PChar}
  p := PChar(string(Arr));
  ShowMessage(p); {ABCDEFGHIJ}

  {直接把 Char 数组赋给 PChar, 会有意想不到的结果, 因为缺少 #0 结束}
  p := Arr;
  //p := @Arr;    {或者这样}
  //p := @Arr[0]; {再或者这样}
  ShowMessage(p); {ABCDEFGHIJ未知数据}
  {这种方式偏偏是我们在使用 API 函数时用得最多的, 但 API 函数都会返回给 #0 结束的, 所以没有问题}
end;


//这是动态数组的例子:
var
  Arr: array of Char;
  s: string;
  p: PChar;
  i: Integer;
begin
  {给 Arr 赋值: A B C D E F G H I J}
  for i := 0 to 9 do
  begin
    SetLength(Arr, i+1);
    Arr[i] := Chr(65+i);
  end;

  Pointer(s) := Arr;
  //Pointer(s) := @Arr[0]; {或者这样}
  ShowMessage(s); {ABCDEFGHIJ}

  p := PChar(Arr);
  //p := @Arr[0]; {或者这样}
  ShowMessage(p); {ABCDEFGHIJ}
end;

 
 
 
 
 

 

 

  
要想彻底理解上面的操作, 需要知道静态数组与动态数组指针问题.
var
  ArrS: array[0..9] of Char; {静态数组}
  ArrD: array of Char;       {动态数组}
  i: Integer;
begin
  {设置动态数组大小, 并给两个数组赋值}
  SetLength(ArrD, 10);
  for i := 0 to 9 do
  begin
    ArrS[i] := Char(65+i);
    ArrD[i] := Char(97+i);
  end;

  {测试赋值结果}
  ShowMessageFmt('%s, %s', [ArrS[0], ArrD[0]]); {A, a}

  {静态数组变量的指针(而非变量本身)和它的第一个元素的指针是同一个}
  ShowMessageFmt('%p, %p', [@ArrS[0], @ArrS]);  {0012FDE2, 0012FDE2}

  {动态数组变量本身(而非变量的指针)就是一个指针, 它和第一个元素的指针也是同一个}
  ShowMessageFmt('%p, %p, %p', [ArrD, @ArrD[0], @ArrD]); {00E7C970, 00E7C970, 0012FDEC}
end;

 
 
 
 
 

 

 

  
另外, 动态数组的构造和静态数组完全不同, 它和 String 的构造 倒是有些相似.

每个动态数组第一个元素前还有 8 个字节, 没 4 个字节记录一个整数;

最前面 4 个字节是用于生存管理的引用计数(当引用计数为 0 时数组自动释放);

第一个元素之前的 4 个字节记录数组的长度. 测试如下:
var
  Arr1,Arr2: array of Char; {定义两个动态数组, 其中一个是为了测试引用计数}
  i: Integer;  {用于指针运算}
  p: PInteger; {用于读取动态数组前面的两个 32 位整数}
begin
  SetLength(Arr1, 10); {设置数组长度}
  Arr2 := Arr1;        {增加一个引用}
  i := Integer(Arr1);  {获取数组地址(这也是数组第一个元素的位置)}

  {获取动态数组的长度}
  i := i-4;
  p := PInteger(i);
  ShowMessage(IntToStr(p^)); {10}

  {获取动态数组的引用计数}
  i := i-4; {再减 4}
  p := PInteger(i);
  ShowMessage(IntToStr(p^)); {2}
end;

 
 
 
 
 

 

 

  

转载于:https://my.oschina.net/hermer/blog/320540

"Mstar Bin Tool"是一款专门针对Mstar系列芯片开发的固件处理软件,主要用于智能电视及相关电子设备的系统维护与深度定制。该工具包特别标注了"LETV USB SCRIPT"模块,表明其对乐视品牌设备具有兼容性,能够通过USB通信协议执行固件读写操作。作为一款专业的固件编辑器,它允许技术人员对Mstar芯片的底层二进制文件进行解析、修改与重构,从而实现系统功能的调整、性能优化或故障修复。 工具包中的核心组件包括固件编译环境、设备通信脚本、操作界面及技术文档等。其中"letv_usb_script"是一套针对乐视设备的自动化操作程序,可指导用户完成固件烧录全过程。而"mstar_bin"模块则专门处理芯片的二进制数据文件,支持固件版本的升级、降级或个性化定制。工具采用7-Zip压缩格式封装,用户需先使用解压软件提取文件内容。 操作前需确认目标设备采用Mstar芯片架构并具备完好的USB接口。建议预先备份设备原始固件作为恢复保障。通过编辑器修改固件参数时,可调整系统配置、增删功能模块或修复已知缺陷。执行刷机操作时需严格遵循脚本指示的步骤顺序,保持设备供电稳定,避免中断导致硬件损坏。该工具适用于具备嵌入式系统知识的开发人员或高级用户,在进行设备定制化开发、系统调试或维护修复时使用。 资源来源于网络分享,仅用于学习交流使用,请勿用于商业,如有侵权请联系我删除!
评论
成就一亿技术人!
拼手气红包6.0元
还能输入1000个字符  | 博主筛选后可见
 
红包 添加红包
表情包 插入表情
 条评论被折叠 查看
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值