2015-02-07 89 views
1

我想用一行簡單的代碼讀取布爾值,如下所示:ReadBuffer(Result,1)。無法用TMemoryStream讀取布爾值

閱讀後,結果爲true。然而

結果:=不會導致

不會 '開關' 的值爲false。
我在這裏顯然是一個基本的錯誤。

全碼:

TYPE 
    TCMemStream= class(TMemoryStream) 
    public 
    function ReadBoolean: Boolean; 
    end; 


function TCMemStream.ReadBoolean: Boolean; 
begin 
ReadBuffer(Result, 1); 
Result:= NOT Result; <-------- after executing this line, Result has the same value 
Result:= false;  <----- this works 
end; 

回答

6

Boolean有效值爲0和1。如果你把不同的值成Boolean變量那麼未來的行爲是不確定的。

您應該讀入一個字節變量b並將b <> 0分配到Boolean中。或者通過將字節轉換爲ByteBool來清理。或者您可以選擇驗證從文件中讀取的值並拒絕01以外的任何值。

+2

或者使用'ByteBool',如果合適的話。 – hvd 2015-02-07 15:35:36

+0

ByteBool也可用於通過類型轉換來清理布爾值。 – 2015-02-07 15:40:16

+0

非常好/奇怪的行爲我得到了使用結果作爲緩衝區。我不知道當將二進制數據直接加載到布爾變量中時它會表現得很奇怪。事實上,在將數據加載到字節var後,其值爲255(代表真)。所以看起來TRUE/FALSE在布爾變量中保持爲$ FF/$ 00。感謝大衛對此有所瞭解。 – Ampere 2015-02-07 21:25:14