【delphi】Byte数组与String类型的转换
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应该就不成问题了!
字节数组转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 := 50to81do 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 := 50to81do 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;
版权声明:本站内容均来自互联网,仅供演示用,请勿用于商业和其他非法用途。如果侵犯了您的权益请与我们联系QQ:729038198,我们将在24小时内删除。
发表评论