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

    还是本着上篇文章的原则,只不过在Delphi中string有点特殊!

    先了解一下Delphi中的string

    1.

    string = AnsiString = 长字符串,理论上长度不受限制,但其实受限于最大寻址范围2的32次方=4G字节,变量Str名字是一个指针,指向位于堆内存的字符序列,字符序列起始于@Str[1],@Str[1]偏移负16个字节的空间存储着字串长度、引用计数等信息。字符序列以NULL结束。
    2.
    string[n] = ShortString = 短字符串,最多容纳255个字符,实际长度是字符长度+1,是Delphi的简单类型,Str[0]存储着字符的个数,第一个字符从Str[1]开始存放,不以NULL结束。

    所以只要理解这一理论,转string应该就不成问题!

    //拿昨天一贴为例:需要将buf[50]-buf[81]的数组转为string[32]
    一、字节数组转string
    1.
    var
      buf: array[0..100] of byte;
      str: string[32];//仅仅开辟了一个32个空间的内存,由于第1位没有用setlength初始化,导致长度不定
      i  : Integer;
    begin
     //如果在此处就对str进行赋值,str[0]位就有计数了,如果在使用之前没有对其进行使用,用SetLength进行赋值
      for i := 50 to 81 do buf[i] := ord('A') + i -50;//测试数据
      SetLength(str, 32);//设置str[0]=32;
      Move(buf[50], str[1], 32);//内存复制
      ShowMessage (str);
    end;
    在这里重新认识一下SetLength,SetLength有2个功能,1.对Short string类型进行设置长度(专门针对其第1位进行设置)2.对动态数组进行设置
    
    2.
    如果想把buf内容赋给string(string与string[]不一样,string是一个动态数组,还没有分配空间,而string[]已经预分配了空间,只不过str[0]处没赋初值,这时如果用Move的话会把Byte数组中的数据拷贝到string空间中,而string这时还没有分配内存,肯定会造成AV错误)
    var
      buf: array[0..100] of byte;
      str: string;
      i  : Integer;
    begin
      for i := 50 to 81 do buf[i] := ord('A') + i -50;
      SetLength(str, 32);
      Move(buf[50], str[1], 32);//注意,这里是从str[1]开始复制的
      ShowMessage (str);
    end;
    
    二、string转为字节数组
    var
      buf: array[0..100] of byte;
      str: string;
    
    begin
      str:='abcdefg';
      Move( str[1],buf[0], 32);//注意,这里是从str[1]开始复制的
      ShowMessageFmt('$%.2d, $%.2d, $%.2d, $%.2d', [buf[3], buf[2], buf[1], buf[0]]);
    
    end;
    View Code

     字节数组与结构体的转换 还是一个原则,在此不再详述!

    type
      PData=^TData;
      TData = packed record
        a: Integer;
        b: Word;
      end;
    var
      bs: array[0..5] of Byte;  
      data: PData;
    begin
      FillChar(bs, Length(bs), 0);
      bs[0] := $10;
      bs[1] := $27;
    
      data := @bs[0];//把字节数组的首址传给结构体
      ShowMessage(IntToStr(data^.a)); //系统帮我们捆绑读取
    
    end;
    View Code
  • 相关阅读:
    Andoid studio 使用Zxing扫描二维码
    WebServices新建及连接数据库
    Android 字典
    ADB Android Device Monitor 导出文件错误
    Android Studio 新建项目默认布局修改
    第九周时间进度表
    第七周学习进度表
    第六周学习进度表
    最优买书问题
    找水王2
  • 原文地址:https://www.cnblogs.com/key-ok/p/3358967.html
Copyright © 2011-2022 走看看