ZeroMemory CopyMemory Copy Move Pos Length SetLength t:AnsiString; t2:WideString; 使用MidBStr 对于ansiString,Length长度基于字节.无论2006还是xe. Ansi前缀函数的都基于字符 在2006中.默认字符是AnsiChar, 对于AnsiString类型的变量 MidStr 基于字符 Rightstr Midstr xe中默认字符是WideChar 对于AnsiString类型的变量 Midstr 基于字节 t:='中国1'; showMessage(inttostr(Length(t)));//5 显然不能为3,否则,Setlength(3),输入3个中文字符就越界了.前后不一致 AnsiLength(t) = 3 AnsiPos('1',t);//3基于字符 showMessage(AnsiMidstr(t,2,2));//基于字符 showMessage(Midstr(t,2,2));//基于字节 xe showMessage(inttostr(Length(t))); //5 2006 Rightstr(t,2); //基于字符 2006 showMessage(Midstr(t,2,2));//基于字符 2006 msg:string; msgW:widestring; begin msg :='中文123123'; msgW := '中文123123'; Delete(msg,1,4);//结果是 msg='123123' Delete(msgW ,1,2);//结果是 msgW ='123123' t2:='中国1'; showMessage(inttostr(Length(t2)));//3 delphi中如何将byte[]字节数组类型的数据转化成string类型的字符串数据B:array[0..15] of byte S := StrPas(@B); For i:=low(b) to high(b) do Move(b[ 0 ],s[ 1 ],Length(b)); 在delphi2010中fillchar中的char还是按字节来做. MyRec = record I: Integer; S: string; R: Real; end; PMyRec = ^MyRec; Rec := PRec^; var PRec: PMyRec; Rec: MyRec; CopyMemory(@Rec,PRec,Sizeof(MyRec)); 需要清零的成员包括 string、动态数组类型、interface 等由 rtl 管理生存期的类型。因为不清零的话,这些个成员就是一个个野指 针,rtl 一跑就直接挂了。这里 TMyRec 里的 S 就是需要清零的成员,New 相当于 GetMem+Initialize |
|