1:SourceString[1]
版本更具可读性。当他们不是完全必要时,我更喜欢不使用指针。
2:此代码将而不是使用Unicode。你必须乘以它:xxx * sizeof(Char)
。 (这将适用于德尔福的Unicode版本之前和之后的版本。)但是,除非大量使用非Ansi字符,否则这将会造成很大的空间浪费。我更喜欢做的是:
procedure TStreamEx.WriteString(const data: string);
var
len: cardinal;
oString: UTF8String;
begin
oString := UTF8String(data);
len := length(oString);
self.WriteBuffer(len, 4);
if len > 0 then
self.WriteBuffer(oString[1], len);
end;
procedure TStreamEx.ReadString(const data: string);
var
len: cardinal;
iString: UTF8String;
begin
self.ReadBuffer(len, 4);
if len > 0 then
begin
SetLength(iString, len);
self.ReadBuffer(iString[1], len);
result := string(iString);
end
else result := '';
end;
(这是一个class helper for TStream
我写的,让人们更方便读取和写入各种事情,并从流的一部分,但如果你不喜欢类帮手,它不应该是太难的基本思路适应不同的格式)
“这是TStream的类助手的一部分” - 我的代码也来自我自己的类助手:)虽然我很确定它不会与Delphi 2010一起工作,除非将字符串更改为AnsiString(我刚刚做过)。尽管如此,我并不是真的对保存UNICOE感兴趣,我承认我会更新我的代码(使用你的)来支持UNICODE。谢谢。 – Ampere 2010-09-27 22:24:26
SourceString [1]版本更具可读性 - 感谢Mason的确认。我在Borland的网站上找到了这些代码,我认为“如果他们以此为例,它肯定是一些东西。”做它更复杂的是什么? – Ampere 2010-09-27 22:30:07
当你有范围检查启用(你应该总是启用范围检查),那么当SourceString [1]'长度为零时会引发一个异常,而'Pointer(SourceString)'将是一个空指针,因为你传入的字节数也是零,所以不会被取消引用。请参阅*清单4 * [我的网站](http://www.cs.wisc.edu/~rkennedy/string-stream)。 – 2010-09-27 22:39:46