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