Delphi Byte数组与Int String之间的相互转换

摘要:
String[n]String[n]=ShortString=短字符串,最多可容纳255个字符。实际长度是字符长度+1,这是一种简单的Delphi类型;Str[0]存储字符数。第一个字符存储在Str[1]中,不以NULL结尾。

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;

免责声明:文章转载自《Delphi Byte数组与Int String之间的相互转换》仅用于学习参考。如对内容有疑问,请及时联系本站处理。

上篇C#之隐式与显示类型转换Python环境的安装下篇

宿迁高防,2C2G15M,22元/月;香港BGP,2C5G5M,25元/月 雨云优惠码:MjYwNzM=

相关文章

jquery动态实现填充下拉框

 当点下拉框时动态加载后台数据。 后台代码 protected void doPost(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException { request.setCharacterEncoding("UTF-8...

实现客户端程序自动更新使用FTP

 最近做的一个项目中需要用到客户端自动更新功能,最初的想法是利用ClickOnce技术来完成,但在实践中发现根本行不能,原因如下: 1)项目应用到了DevExpress控件包,用ClickOnce发布的自动更新程序,客户在安装时报在GAC中找不到控件dll的错。 2)ClickOnce安装无法实现根据用户安装时录入的参数(比如数据库服务器名、数据库用户名...

06_zookeeper原生Java API使用

【Zookeeper构造方法概述】 /** * 客户端和zk服务端的连接是一个异步的过程 * 当连接成功后,客户端会收到一个watch通知 * * ZooKeeper(String connectString, int sessionTimeout, Watcher watcher, *...

java中使用MD5进行加密(转)

   在各种应用系统的开发中,经常需要存储用户信息,很多地方都要存储用户密码,而将用户密码直接存储在服务器上显然是不安全的,本文简要介绍工作中常用的 MD5加密算法,希望能抛砖引玉。(一)消息摘要简介    一个消息摘要就是一个数据块的数字指纹。即对一个任意长度的一个数据块进行计算,产生一个唯一指印(对于SHA1是产生一个20字节的二进制数组)。消息摘要是...

EasySharding.EFCore 如何设计使用一套代码完成的EFCore Migration 构建Saas系统多租户不同业务需求且满足租户自定义分库分表、数据迁移能力?

下面用一篇文章来完成这些事情 多租户系统的设计单纯的来说业务,一套Saas多租户的系统,面临很多业务复杂性,不同的租户存在不同的业务需求,大部分相同的表结构,那么如何使用EFCore来完成这样的设计呢?满足不同需求的数据库结构迁移 这里我准备设计一套中间件来完成大部分分库分表的工作,然后可以通过自定义的Migration 数据库文件来迁移构建不同的租户数据...

JQuery EasyUI datagrid 批量编辑和提交

前台主要代码: <script type="text/javascript"> $(function() { var $dg = $("#dg"); $dg.datagrid({ url : "servlet/list", width : 700,...