Warning: file_get_contents(/data/phpspider/zhask/data//catemap/9/delphi/9.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Delphi 无法使用TMemoryStream读取布尔值_Delphi - Fatal编程技术网

Delphi 无法使用TMemoryStream读取布尔值

Delphi 无法使用TMemoryStream读取布尔值,delphi,Delphi,我试图用一段简单的代码读取一个布尔值,如下所示:ReadBuffer(Result,1) 阅读后,结果是正确的。然而 结果:=非结果 不会将值“切换”为false。 我显然犯了一个基本的错误 完整代码: TYPE TCMemStream= class(TMemoryStream) public function ReadBoolean: Boolean; end; function TCMemStream.ReadBoolean: Boolean; begin

我试图用一段简单的代码读取一个布尔值,如下所示:ReadBuffer(Result,1)

阅读后,结果是正确的。然而

结果:=非结果

不会将值“切换”为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;
类型
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为这一点提供了一些信息。