【问题标题】:What does this mean in C# and how can I use it? [closed]这在 C# 中是什么意思,我该如何使用它? [关闭]
【发布时间】:2017-09-07 10:28:04
【问题描述】:

我在 IDA Pro 中查看了以下 C++ 代码:

__int64 __fastcall sub_14023B480(__int64 a1)
{
  return *(_DWORD *)(a1 + 0x384) > 0 && !(*(_BYTE *)(a1 + 0xE8) & 8) && !(*(_DWORD *)(a1 + 0x290) & 0x800000);
}

a1 是一个实体。

0x384 指向一个健康值。

0xE80x290 指向某种标志,但我怎么不能用 C# 写这样的检查:

if(!(a1 + 0xE8) & 8)
{
    //Do something
}

由于在 C# 中,& 运算符返回 int 值。

【问题讨论】:

  • (… & 8) == 0?
  • C#版本中a1是什么类型?整数64?将类型后缀附加到数字文字以匹配表达式的其余部分。显示完整的代码,你得到什么编译器错误或运行时异常? “...int value...”:二元运算符&取整型,long/ulong都是这样。

标签: c# c++ reverse-engineering


【解决方案1】:

在 C# 中,!运算符不能应用于像这样的非布尔类型 - 众所周知,这一事实让 C 和 C++ 程序员都感到惊讶。

要修复你的标志检查,你会写

if (((a1 + 0xE8) & 8) == 0)
{
    //Do something
}

由于运算符优先级,所有括号都是必需的。如果没有“中间”括号,“8 == 0”将在 & 之前计算,并导致另一个编译器错误,“运算符 & 不能应用于 int 和 bool”。

【讨论】:

    猜你喜欢
    • 2014-03-19
    • 1970-01-01
    • 1970-01-01
    • 2016-01-07
    • 2022-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多