如何将含Chr(0)的ARRAY[0..60] of Ansichar数组转换为完整字符串?
如何将含ASCII零码的Ansichar数组完整转换为字符串?
你遇到的问题是因为Delphi的字符串(AnsiString/UnicodeString)默认以ASCII零码(Chr(0))作为结束标志,直接赋值时会自动截断到第一个零码位置。要完整保留所有字符,需要绕过这种默认的截断逻辑,直接操作内存或者使用指定长度的构造方法,以下是两种可行方案:
方案1:使用SetString函数(推荐)
SetString可以直接指定字符串的长度和数据源指针,不会因为零码截断内容:
var MyText: array[0..60] of Ansichar; MyString: AnsiString; // 用AnsiString匹配Ansichar类型,避免编码转换 begin // 假设MyText已完成赋值 SetString(MyString, @MyText[0], Length(MyText)); // 注:Length(MyText)返回数组总元素数(0..60共61个),如果只需复制前N个字符,替换为N即可 end;
方案2:使用Move内存拷贝
先为字符串分配足够的内存,再直接拷贝数组内容:
var MyText: array[0..60] of Ansichar; MyString: AnsiString; begin // 先分配与数组长度一致的字符串内存 SetLength(MyString, Length(MyText)); // 从数组起始位置拷贝到字符串(注意Delphi字符串索引从1开始) Move(MyText[0], MyString[1], Length(MyText)); end;
注意事项
- 如果你使用的是Delphi 2009及以后版本,默认
string是UnicodeString,直接拷贝Ansichar会触发编码转换。建议先转换成AnsiString保留原始字节,之后再根据需求转为UnicodeString。 - 如果数组并非全部有效(比如你知道实际需要保留的字符数是N),把代码中的
Length(MyText)替换为实际的N值,避免拷贝多余的空字符。
内容的提问来源于stack exchange,提问作者Michael Hutter
相关产品推荐
相关产品推荐

