zoukankan      html  css  js  c++  java
  • 字节数组与基础数据类型的转换

    首先强调一点:

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

    如: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
  • 相关阅读:
    Elasticsearch拼音分词和IK分词的安装及使用
    Java同步、异步区别
    Elasticsearch深入搜索之全文搜索及JavaAPI使用
    Elasticsearch学习笔记
    Elasticsearch拼音和ik分词器的结合应用
    Elasticsearch深入搜索之结构化搜索及JavaAPI的使用
    Java反射的理解
    打印三个长宽不同的矩形
    是非人生 — 一个菜鸟程序员的5年职场路 第23节
    是非人生 — 一个菜鸟程序员的5年职场路 第35节
  • 原文地址:https://www.cnblogs.com/key-ok/p/3358966.html
Copyright © 2011-2022 走看看