字节数组与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[]-buf[]的数组转为string[]
- 一、字节数组转string
- .
- var
- buf: array[..] of byte;
- str: string[];//仅仅开辟了一个32个空间的内存,由于第1位没有用setlength初始化,导致长度不定
- i : Integer;
- begin
- //如果在此处就对str进行赋值,str[]位就有计数了,如果在使用之前没有对其进行使用,用SetLength进行赋值
- for i := to do buf[i] := ord('A') + i -;//测试数据
- SetLength(str, );//设置str[]=;
- Move(buf[], str[], );//内存复制
- ShowMessage (str);
- end;
- 在这里重新认识一下SetLength,SetLength有2个功能,.对Short string类型进行设置长度(专门针对其第1位进行设置).对动态数组进行设置
- .
- 如果想把buf内容赋给string(string与string[]不一样,string是一个动态数组,还没有分配空间,而string[]已经预分配了空间,只不过str[]处没赋初值,这时如果用Move的话会把Byte数组中的数据拷贝到string空间中,而string这时还没有分配内存,肯定会造成AV错误)
- var
- buf: array[..] of byte;
- str: string;
- i : Integer;
- begin
- for i := to do buf[i] := ord('A') + i -;
- SetLength(str, );
- Move(buf[], str[], );//注意,这里是从str[]开始复制的
- ShowMessage (str);
- end;
- 二、string转为字节数组
- var
- buf: array[..] of byte;
- str: string;
- begin
- str:='abcdefg';
- Move( str[],buf[], );//注意,这里是从str[]开始复制的
- ShowMessageFmt('$%.2d, $%.2d, $%.2d, $%.2d', [buf[], buf[], buf[], buf[]]);
- end;
字节数组与结构体的转换 还是一个原则,在此不再详述!
- type
- PData=^TData;
- TData = packed record
- a: Integer;
- b: Word;
- end;
- var
- bs: array[..] of Byte;
- data: PData;
- begin
- FillChar(bs, Length(bs), );
- bs[] := $;
- bs[] := $;
- data := @bs[];//把字节数组的首址传给结构体
- ShowMessage(IntToStr(data^.a)); //系统帮我们捆绑读取
- end;
字节数组与String类型的转换的更多相关文章
- 【delphi】Byte数组与String类型的转换
string string = AnsiString = 长字符串,理论上长度不受限制,但其实受限于最大寻址范围2的32次方=4G字节: 变量Str名字是一个指针,指向位于堆内存的字符序列,字符序列起 ...
- Java中二进制、十进制、十六进制及ASCII码与String及字节数组与十六进制之间的转换
public class DigitalTrans { /** * 数字字符串转ASCII码字符串 * * @param String * 字符串 * @return ASCII字符串 */ publ ...
- 【转】java中byte数组与int类型的转换(两种方式)----不错
原文网址:http://blog.csdn.net/piaojun_pj/article/details/5903009 java中byte数组与int类型的转换,在网络编程中这个算法是最基本的算法, ...
- golang数据基本数据类型和string类型的转换
基本类型之间的转换 golang在不同类型的变量之间赋值时需要显式转换,也就是说golang中数据类型不能自动转换. 表达式T(v)将值v转换为类型T 1.数据类型的转换可以是从范围小——>范围 ...
- C#中字符数组,字节数组和string之间的转化
转自:http://blog.csdn.net/wangxiaoqin00007/article/details/17675419 NDC(NetworkDiskClient)的界面和后台程序之间用S ...
- C++入门经典-例6.22-字符串与数组,string类型的数组
1:数组中存储的数据也可以是string类型的.代码如下: // 6.22.cpp : 定义控制台应用程序的入口点. // #include "stdafx.h" #include ...
- 基本数据类型和string类型的转换
基本数据类型转string类型: 方式1:fmt.Sprintf("%参数", 表达式) [个人习惯这个,灵活] 函数的介绍: func Sprintf func Sprintf( ...
- 深入 JAVA里面关于byte数组和String之间的转换问题
把byte转化成string,必须经过编码. 例如下面一个例子: importjava.io.UnsupportedEncodingException; publicclass test{ pub ...
- 【语言基础】c++ 基本数据类型与字节数组(string,char [] )之间的转化方法
有时候我们需要将基本数据类型转化为字节,以便写入文件,然后必要时还需要将这些字节读出来.有人说,为啥不把数字直接存进文件呢?比如:100,000,000,我们直接存数字明文到文件那就是9个字符(cha ...
随机推荐
- [转]谈谈 Bias-Variance Tradeoff
https://liam0205.me/2017/03/25/bias-variance-tradeoff/ 谢谢原作者! 谈谈 Bias-Variance Tradeoff 发表于 2017 年 0 ...
- [转]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 ...
- Android SO UPX壳问题小记
网上有篇 Android SO(动态链接库)UPX加固指南,详细介绍了如何使用UPX给Android SO加壳,尝试做了一下结果ok,这里只记录遇到的几个小问题. 1.40k以下so不能加壳 kiii ...
- Gtk-WARNING **: cannot open display: :0.0
Gtk-WARNING **: cannot open display: :0.0 https://blog.csdn.net/Rong_Toa/article/details/80365932
- 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 ...
- Unity3D 重写下拉菜单/Dropdown组件、开启每个按钮可用
Override Dropdown Component 本文提供全流程,中文翻译. Chinar 坚持将简单的生活方式,带给世人!(拥有更好的阅读体验 -- 高分辨率用户请根据需求调整网页缩放比例) ...
- 51Nod 1459:迷宫游戏(最短路)
1459 迷宫游戏 基准时间限制:1 秒 空间限制:131072 KB 分值: 0 难度:基础题 收藏 关注 你来到一个迷宫前.该迷宫由若干个房间组成,每个房间都有一个得分,第一次进入这个房间, ...
- i = i ++;的分解
步骤分解: package wrong; public class ShortTest { public static void main(String args[]) { /* * i = i ++ ...
- python 常用库及安装使用
#win10 + python3.5.2 #pip install xxx 自动下载的缓存位置: #win7 - c:\用户\(你的用户名)\AppData\Local\pip\cache\ #l ...
- C++中的ravalue学习笔记
一.学习笔记 1. A a = 42; 会先以42为参数构造一个A类对象,然后调用拷贝构造函数来构造a,目前编译器优化掉了拷贝构造函数的调用,测试拷贝构造函数是没有被调用的,但是其权限不能为priva ...