还是本着上篇文章的原则,只不过在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应该就不成问题!

  1. //拿昨天一贴为例:需要将buf[]-buf[]的数组转为string[]
  2. 一、字节数组转string
  3. .
  4. var
  5. buf: array[..] of byte;
  6. str: string[];//仅仅开辟了一个32个空间的内存,由于第1位没有用setlength初始化,导致长度不定
  7. i : Integer;
  8. begin
  9. //如果在此处就对str进行赋值,str[]位就有计数了,如果在使用之前没有对其进行使用,用SetLength进行赋值
  10. for i := to do buf[i] := ord('A') + i -;//测试数据
  11. SetLength(str, );//设置str[]=;
  12. Move(buf[], str[], );//内存复制
  13. ShowMessage (str);
  14. end;
  15. 在这里重新认识一下SetLength,SetLength2个功能,.对Short string类型进行设置长度(专门针对其第1位进行设置).对动态数组进行设置
  16.  
  17. .
  18. 如果想把buf内容赋给string(stringstring[]不一样,string是一个动态数组,还没有分配空间,而string[]已经预分配了空间,只不过str[]处没赋初值,这时如果用Move的话会把Byte数组中的数据拷贝到string空间中,而string这时还没有分配内存,肯定会造成AV错误)
  19. var
  20. buf: array[..] of byte;
  21. str: string;
  22. i : Integer;
  23. begin
  24. for i := to do buf[i] := ord('A') + i -;
  25. SetLength(str, );
  26. Move(buf[], str[], );//注意,这里是从str[]开始复制的
  27. ShowMessage (str);
  28. end;
  29.  
  30. 二、string转为字节数组
  31. var
  32. buf: array[..] of byte;
  33. str: string;
  34.  
  35. begin
  36. str:='abcdefg';
  37. Move( str[],buf[], );//注意,这里是从str[]开始复制的
  38. ShowMessageFmt('$%.2d, $%.2d, $%.2d, $%.2d', [buf[], buf[], buf[], buf[]]);
  39.  
  40. end;

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

  1. type
  2. PData=^TData;
  3. TData = packed record
  4. a: Integer;
  5. b: Word;
  6. end;
  7. var
  8. bs: array[..] of Byte;
  9. data: PData;
  10. begin
  11. FillChar(bs, Length(bs), );
  12. bs[] := $;
  13. bs[] := $;
  14.  
  15. data := @bs[];//把字节数组的首址传给结构体
  16. ShowMessage(IntToStr(data^.a)); //系统帮我们捆绑读取
  17.  
  18. end;

字节数组与String类型的转换的更多相关文章

  1. 【delphi】Byte数组与String类型的转换

    string string = AnsiString = 长字符串,理论上长度不受限制,但其实受限于最大寻址范围2的32次方=4G字节: 变量Str名字是一个指针,指向位于堆内存的字符序列,字符序列起 ...

  2. Java中二进制、十进制、十六进制及ASCII码与String及字节数组与十六进制之间的转换

    public class DigitalTrans { /** * 数字字符串转ASCII码字符串 * * @param String * 字符串 * @return ASCII字符串 */ publ ...

  3. 【转】java中byte数组与int类型的转换(两种方式)----不错

    原文网址:http://blog.csdn.net/piaojun_pj/article/details/5903009 java中byte数组与int类型的转换,在网络编程中这个算法是最基本的算法, ...

  4. golang数据基本数据类型和string类型的转换

    基本类型之间的转换 golang在不同类型的变量之间赋值时需要显式转换,也就是说golang中数据类型不能自动转换. 表达式T(v)将值v转换为类型T 1.数据类型的转换可以是从范围小——>范围 ...

  5. C#中字符数组,字节数组和string之间的转化

    转自:http://blog.csdn.net/wangxiaoqin00007/article/details/17675419 NDC(NetworkDiskClient)的界面和后台程序之间用S ...

  6. C++入门经典-例6.22-字符串与数组,string类型的数组

    1:数组中存储的数据也可以是string类型的.代码如下: // 6.22.cpp : 定义控制台应用程序的入口点. // #include "stdafx.h" #include ...

  7. 基本数据类型和string类型的转换

    基本数据类型转string类型: 方式1:fmt.Sprintf("%参数", 表达式) [个人习惯这个,灵活] 函数的介绍: func Sprintf func Sprintf( ...

  8. 深入 JAVA里面关于byte数组和String之间的转换问题

    把byte转化成string,必须经过编码.  例如下面一个例子:  importjava.io.UnsupportedEncodingException; publicclass test{ pub ...

  9. 【语言基础】c++ 基本数据类型与字节数组(string,char [] )之间的转化方法

    有时候我们需要将基本数据类型转化为字节,以便写入文件,然后必要时还需要将这些字节读出来.有人说,为啥不把数字直接存进文件呢?比如:100,000,000,我们直接存数字明文到文件那就是9个字符(cha ...

随机推荐

  1. [转]谈谈 Bias-Variance Tradeoff

    https://liam0205.me/2017/03/25/bias-variance-tradeoff/ 谢谢原作者! 谈谈 Bias-Variance Tradeoff 发表于 2017 年 0 ...

  2. [转]How rival bots battled their way to poker supremacy

    How rival bots battled their way to poker supremacy http://www.nature.com/news/how-rival-bots-battle ...

  3. Android SO UPX壳问题小记

    网上有篇 Android SO(动态链接库)UPX加固指南,详细介绍了如何使用UPX给Android SO加壳,尝试做了一下结果ok,这里只记录遇到的几个小问题. 1.40k以下so不能加壳 kiii ...

  4. Gtk-WARNING **: cannot open display: :0.0

    Gtk-WARNING **: cannot open display: :0.0 https://blog.csdn.net/Rong_Toa/article/details/80365932

  5. golang 3des/ecb/cbc/pkcs5 加解密

    本人新手,参考文档: http://blog.studygolang.com/2013/01/go%E5%8A%A0%E5%AF%86%E8%A7%A3%E5%AF%86%E4%B9%8Bdes/ h ...

  6. Unity3D 重写下拉菜单/Dropdown组件、开启每个按钮可用

    Override Dropdown Component 本文提供全流程,中文翻译. Chinar 坚持将简单的生活方式,带给世人!(拥有更好的阅读体验 -- 高分辨率用户请根据需求调整网页缩放比例) ...

  7. 51Nod 1459:迷宫游戏(最短路)

    1459 迷宫游戏  基准时间限制:1 秒 空间限制:131072 KB 分值: 0 难度:基础题  收藏  关注 你来到一个迷宫前.该迷宫由若干个房间组成,每个房间都有一个得分,第一次进入这个房间, ...

  8. i = i ++;的分解

    步骤分解: package wrong; public class ShortTest { public static void main(String args[]) { /* * i = i ++ ...

  9. python 常用库及安装使用

    #win10 + python3.5.2 #pip install xxx   自动下载的缓存位置: #win7 - c:\用户\(你的用户名)\AppData\Local\pip\cache\ #l ...

  10. C++中的ravalue学习笔记

    一.学习笔记 1. A a = 42; 会先以42为参数构造一个A类对象,然后调用拷贝构造函数来构造a,目前编译器优化掉了拷贝构造函数的调用,测试拷贝构造函数是没有被调用的,但是其权限不能为priva ...