这在 C# 中意味着什么,我该如何使用它?
What does this mean in C# and how can I use it?
我在 IDA Pro 中查看了以下 C++ 代码:
__int64 __fastcall sub_14023B480(__int64 a1)
{
return *(_DWORD *)(a1 + 0x384) > 0 && !(*(_BYTE *)(a1 + 0xE8) & 8) && !(*(_DWORD *)(a1 + 0x290) & 0x800000);
}
a1
是一个实体。
0x384
指向健康值。
0xE8
和 0x290
指向某种标志,但为什么我不能在 C# 中编写这样的检查:
if(!(a1 + 0xE8) & 8)
{
//Do something
}
因为在 C# 中 &
运算符 returns in int value.
在 C# 中,!运算符不能像这样应用于非布尔类型 - 众所周知,这一事实会让 C 和 C++ 程序员都感到惊讶。
要修复标志检查,您可以编写
if (((a1 + 0xE8) & 8) == 0)
{
//Do something
}
由于运算符优先级,所有括号都是必需的。如果没有 "middle" 括号,“8 == 0”将在 & 之前计算并导致另一个编译器错误,"Operator & cannot be applied to int and bool".
我在 IDA Pro 中查看了以下 C++ 代码:
__int64 __fastcall sub_14023B480(__int64 a1)
{
return *(_DWORD *)(a1 + 0x384) > 0 && !(*(_BYTE *)(a1 + 0xE8) & 8) && !(*(_DWORD *)(a1 + 0x290) & 0x800000);
}
a1
是一个实体。
0x384
指向健康值。
0xE8
和 0x290
指向某种标志,但为什么我不能在 C# 中编写这样的检查:
if(!(a1 + 0xE8) & 8)
{
//Do something
}
因为在 C# 中 &
运算符 returns in int value.
在 C# 中,!运算符不能像这样应用于非布尔类型 - 众所周知,这一事实会让 C 和 C++ 程序员都感到惊讶。
要修复标志检查,您可以编写
if (((a1 + 0xE8) & 8) == 0)
{
//Do something
}
由于运算符优先级,所有括号都是必需的。如果没有 "middle" 括号,“8 == 0”将在 & 之前计算并导致另一个编译器错误,"Operator & cannot be applied to int and bool".