首页 > 【delphi】Byte数组与String类型的转换

【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 := 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 

  stringstring[]不一样,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;  

转载于:https://www.cnblogs.com/lcw/p/3352864.html

更多相关:

  • 工作中多次遇到Python版本的签名算法,需要用Go版本再实现一遍,这就需要牵扯到Python 2.7中的urllib中的quote,quote_plus和Go中net/url包中的url.QueryEscape的关系。 下面直接给出它们的关系: urllib.quote_plus(str)等同于url.QueryEscape(s...

  • C语言中操作字符串用C运行时函数:strtok, strcmp, strcpy等等,直接操作内存。在c++引入的字符串操作类std:string ,string类中必有一个私有成员,其是一个char*,用户记录从堆上分配内存的地址,其在构造时分配内存,在析构时释放内存。因为是从堆上分配内存,所以string类在维护这块内存上是格外小心...

  • 思路 大体思路:数据结构选用栈,读到左括号时入栈,读到右括号时判断是否匹配,匹配则左括号出栈,非括号字符则继续往下读 代码 #include #include #include using namespace std;bool is_match_parentheses(co...

  • 方法1: Controller

  • str = Regex.Replace(str, @"]*?>.*?", "", RegexOptions.IgnoreCase); //str为需要校验的字符 str = Regex.Replace(str, @"[~`@#$%^&*()_+{}|<>/\[]]", "", Re...

  • importjava.security.SecureRandom;importjavax.crypto.Cipher;importjavax.crypto.SecretKey;importjavax.crypto.SecretKeyFactory;importjavax.crypto.spec.DESKeySpec;//结果与DES算...

  • 题目:替换空格 请实现一个函数,把字符串 s 中的每个空格替换成"%20"。 输入:s = "We are happy." 输出:"We%20are%20happy." 限制: 0 <= s 的长度 <= 10000 解题: 时间复杂度:O(n) 空间复杂度:O(n) class Solution { public:s...

  • 在C++11标准库中,string.h已经添加了to_string方法,方便从其他类型(如整形)快速转换成字面值。 例如: for (size_t i = 0; i < texArrSize; i++)RTX_Shader.SetInt(string("TexArr[") + to_string(i) + "]", 7 + i);...

  • Ubuntu 14.04安装并升级之后,变成楷体字体非常难看,我昨天搞了一晚上,终于理了个头绪,这里整理一下。 经过网上调研,大家的一致看法是,使用开源字体库文泉驿的微黑字体效果比较理想,甚至效果不输windows平台的雅黑字体。下面我打算微黑来美化Ubuntu 14.04. 1.安装文泉驿微黑字体库 sudo aptitude...

  • 使用string时发现了一些坑。 我们知道stl 容器并不是线程安全的,所以在使用它们的过程中往往需要一些同步机制来保证并发场景下的同步更新。 应该踩的坑还是一个不拉的踩了进去,所以还是记录一下吧。 string作为一个容器,随着我们的append 或者 针对string的+ 操作都会让string内部的数据域动态增加,而动态增加的...

  •         NSString * str = @"123";char buf[20];[str getCString:buf maxLength:20 encoding:NSASCIIStringEncoding];NSLog(@"%s",buf); 转载于:https://blog.51cto.com/8947509/1...

  • sscanf 目录 名称:函数原型:头文件:说明:支持集合操作:例子: 编辑本段名称:   sscanf() - 从一个字符串中读进与指定格式相符的数据. 编辑本段函数原型:   Int sscanf( const char *, const char *, ...);   int scanf( const char...