首先强调一点:
任何数据在内存中都是线性存储的,归根结底都是由一个字节数组表示的!
如:Integer占4个存储单元,32bit,在内存中他就是由一个长度为4的字节数组来表示!只不过在读取该类型时,系统帮我们根据不同的数据类型对数据进行捆绑读取(如果上学时学过汇编就可以想出,如果自己取的话需要把高地址的内容乘以某值后再加上低址的值)。
值得注意的是:对于Delphi中的多维动态数组,不要用类似于内存复制的函数进行复制,如CopyMemory,Move等。因为多维动态数组的内存是不连续的!
只要把握住这一原则,我想类型转换我就不多讲了
//Word与ByteArr的互转 一、从ByteArr转为Word(Integer也一样,不过存储单元占的位数不一样) 从字节数组中的第10个元素开始,转为Word类型的数据! 方法1: type TByteArrs=array[0..20] of byte; var A1 : TByteArrs; B : Word; begin A1[0] := 0; A1[1] := 1; A1[10] := 3; A1[11] := 0; Move(A1[10],B,2);//因Word占2个存储单元,故需要复制2个数组长度,也可以用SizeOf(Word)或SizeOf(Integer) ShowMessage(inttostr(B)); end; 方法2: type TByteArrs=array[0..20] of byte; var A1 : TByteArrs; B : PWord; begin A1[0] := 0; A1[1] := 1; A1[10] := 3; A1[11] := 0; B := @A1[10];//直接把Pword指针指向字节数组的A1[10]元素上,然后系统帮我们捆绑读取该类型的值! ShowMessage(inttostr(B^)); end; 二、Word(Integer)转为字节数组 //这里仅仅演示用指针直接指向word类型数据所占存储单元的首址,如果想复制一份,可用Move type TWordByte=array of byte; var bs : TWordByte; b : Word; begin b:=10; bs:=@b ;//把b的首址传给bs,由于Word占用2个存储单元,转换就为2个数组 ShowMessageFmt('$%.2d, $%.2d', [ bs[1], bs[0]]); end;