Delphi 无法使用TMemoryStream读取布尔值
我试图用一段简单的代码读取一个布尔值,如下所示:ReadBuffer(Result,1) 阅读后,结果是正确的。然而 结果:=非结果 不会将值“切换”为false。Delphi 无法使用TMemoryStream读取布尔值,delphi,Delphi,我试图用一段简单的代码读取一个布尔值,如下所示:ReadBuffer(Result,1) 阅读后,结果是正确的。然而 结果:=非结果 不会将值“切换”为false。 我显然犯了一个基本的错误 完整代码: TYPE TCMemStream= class(TMemoryStream) public function ReadBoolean: Boolean; end; function TCMemStream.ReadBoolean: Boolean; begin
我显然犯了一个基本的错误 完整代码:
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;
类型
TCMemStream=class(TMemoryStream)
公众的
函数ReadBoolean:Boolean;
结束;
函数TCMemStream.ReadBoolean:Boolean;
开始
读取缓冲区(结果,1);
结果:=非结果 布尔值的有效值为0和1。如果将不同的值放入布尔
变量中,则未来行为未定义
您应该读入字节变量b
,并将b0
赋值到布尔值中。或者通过将字节强制转换为ByteBool
进行清理。或者,您可以选择验证从文件读取的值,并拒绝除0
和1
之外的任何内容 布尔值的有效值为0和1。如果将不同的值放入布尔
变量中,则未来行为未定义
您应该读入字节变量b
,并将b0
赋值到布尔值中。或者通过将字节强制转换为ByteBool
进行清理。或者,您可以选择验证从文件读取的值,并拒绝除0
和1
之外的任何内容 如果合适的话,也可以使用ByteBool
。ByteBool还可以使用typecast来清理布尔值。我使用Result作为缓冲区得到了非常好/奇怪的行为。我不知道它在将二进制数据直接加载到布尔变量中时会表现得那么奇怪。事实上,在将数据加载到字节变量中后,它的值是255(表示true)。因此,在布尔变量中,TRUE/FALSE似乎被保留为$FF/$00。感谢David对此做了一些解释。如果合适的话,也可以使用ByteBool
。ByteBool还可以使用类型转换来清理布尔值。我使用结果作为缓冲区得到了非常好/奇怪的行为。我不知道它在将二进制数据直接加载到布尔变量中时会表现得那么奇怪。事实上,在将数据加载到字节变量中后,它的值是255(表示true)。因此,在布尔变量中,TRUE/FALSE被保持为$FF/$00。感谢David为这一点提供了一些信息。