大悟还俗

邮箱 key_ok@qq.com 我的收集 http://pan.baidu.com/share/home?uk=1177427271
posts - 236, comments - 8, trackbacks - 0, articles - 0
  新随笔  :: 联系 :: 订阅 订阅  :: 管理

字节数组与基础数据类型的转换

Posted on 2013-10-09 12:28  大悟还俗_2  阅读(...)  评论(... 编辑 收藏

 

首先强调一点:

任何数据在内存中都是线性存储的,归根结底都是由一个字节数组表示的!

如: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;
View Code