zoukankan      html  css  js  c++  java
  • Delphi Byte数组与Int String之间的相互转换

    http://www.cnblogs.com/lcw/p/3352864.html

    string

      string = AnsiString = 长字符串,理论上长度不受限制,但其实受限于最大寻址范围2的32次方=4G字节;

      变量Str名字是一个指针,指向位于堆内存的字符序列,字符序列起始于@Str[1],@Str[1]偏移负16个字节的空间存储着字串长度、引用计数等信息。字符序列以NULL结束。

    string[n]

      string[n] = ShortString = 短字符串,最多容纳255个字符,实际长度是字符长度+1,是Delphi的简单类型;

      Str[0]存储着字符的个数,第一个字符从Str[1]开始存放,不以NULL结束。

    字节数组转string

    把buf内容赋给ShortString

    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. 对动态数组进行设置

    把buf内容赋给AnsiString 

    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;
  • 相关阅读:
    C++虚继承内存布局
    编译OpenJDK记录
    Node.js + Express 调研
    软件工程开发工具
    Servlets & JSP & JavaBean 参考资料
    Eclipse AST 相关资料
    Git & github 最常用操作笔记
    Java入门学习资料整理
    从变量的类型转换看C语言的思维模式
    数学地图(1)
  • 原文地址:https://www.cnblogs.com/zhrong/p/5736380.html
Copyright © 2011-2022 走看看