字节数组与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 ...
随机推荐
- pprof进行golang程序性能分析
一.导入包 import _ "net/http/pprof" 二.启动监控routine go func() { http.ListenAndServe("0.0.0. ...
- Vim 文件coding gbk格式
只需在 ~/.vimrc设置一致即可.文件编辑可正常显示中文,cat,不能正常显示,显示乱码,详情参考上篇. set fileencodings=utf-8,ucs-bom,gb18030,gbk,g ...
- PWA需要的技术
1 Manifest https://developer.mozilla.org/zh-CN/docs/Web/Manifest 2 Service Work ...
- java poi解析excel报错处理
org.apache.xmlbeans.SchemaTypeLoaderException: XML-BEANS compiled schema: Incompatible minor version ...
- HDU 1425 C++使用sort函数
sort Time Limit: 6000/1000 MS (Java/Others) Memory Limit: 65536/32768 K (Java/Others) Total Submissi ...
- NetCore平台下使用RPC框架Hprose
NetCore下使用RPC框架Hprose https://www.jianshu.com/p/c903fca44d5d Hprose是国内非常优秀的RPC框架,和其它RPC框架比较起来,其它框架一般 ...
- web前端的问题整理
css实现三列布局?如果中间又是自适应布局怎么做?
- Map 知识整理
首先是HashMap的学习,理解散列的概念以及相关的实现,并且会学习HashMap的源码,理解为什么HashMap的速度如此之快. 声明:参考到的资料在下方列出. 1.<Java编程思想> ...
- LOJ3048 「十二省联考 2019」异或粽子
题意 题目描述 小粽是一个喜欢吃粽子的好孩子.今天她在家里自己做起了粽子. 小粽面前有 $n$ 种互不相同的粽子馅儿,小粽将它们摆放为了一排,并从左至右编号为 $1$ 到 $n$.第 $i$ 种馅儿具 ...
- mongodb 通过mongodump来备份Sharded Cluste分片集群
1,mongodb所有组件官方文档地址:https://docs.mongodb.com/manual/reference/command/,所有的基础组件都在里面,包括备份恢复的mongodump. ...