2015-02-07 87 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