Byte数组与WideString的问题(300分)

  • 主题发起人 主题发起人 K
  • 开始时间 开始时间
K

K

Unregistered / Unconfirmed
GUEST, unregistred user!
PByteArray = ^TByteArray;
TByteArray = array[0..MaxInt div SizeOf(Byte) - 1] of Byte;

function TcxTokensStack.StackTokensToStr(ATokens: PByteArray): string;
var
AWStr: WideString;
begin
SetLength(AWStr, ATokens^[1]);
if ATokens^[1] > 0 then
Move(ATokens^[3], AWStr[1], ATokens^[1] shl 1);
Result := AWStr;
end;

用调试器查看ATokens^[1]是8,这个ATokens^[1]中是一个字符串"平台印刷"
SetLength(AWStr, ATokens^[1])执行后AWStr为'平台印刷'#0'0!'#0,正确结果应是'平台印刷'没有后面的#0'0!'#0

我有2个问题:
1、我第一次调控件源码,对ATokens^[1]这种形式不理解,ATokens^[1]中是存储的字符串地址吗?但为什么用调试器查看是8正好是字符串的长度。如果是存储的字符串长度那又是如何将字符串赋给AWStr?

2、如何更改代码来正确处理中文字符串,英文串没有这个问题。
谢谢各位
 
ATokens^[1]存储的是长度,ATokens^[3]开始是内容,ATokens^[1] shl 1是长度乘以2
 
....
Result := AWStr;
SetLength(Result, strlen(Result));
end;
 
爱元元的哥哥:
为何执行第一行SetLength(AWStr, ATokens^[1]);AWStr变量的值就是'平台印刷'#0'0!'#0

tseug:
谢谢,你的方法我试了没问题,应是SetLength(Result, strlen(PChar(Result)));
 
SetLength(AWStr, ATokens^[1]);这种申请内存的行为,接着的一句话就应该是把申请的内存清零,这是好的习惯。
 
多人接受答案了。
 

Similar threads

S
回复
0
查看
1K
SUNSTONE的Delphi笔记
S
S
回复
0
查看
900
SUNSTONE的Delphi笔记
S
S
回复
0
查看
3K
SUNSTONE的Delphi笔记
S
S
回复
0
查看
2K
SUNSTONE的Delphi笔记
S
后退
顶部