如何检查某个 uint 是否应用了 0x01000000 掩码?

How to check if certain uint has 0x01000000 mask applied?

我做了一些逆向工程。有一个 uint 值指示存储内容的槽号。但是有不同类型的存储。当某些东西存储在不同的存储中时,该值应用了 0x01000000 掩码。当它存储在另一个存储中时,掩码是 0x02000000.

我的函数收到这个值,我需要确定存储和插槽。 例如:

0x00000005 - 存储 0 中的第五个插槽。

0x01000009 - 是存储 1 中的插槽 9。

0x02000002 - 是存储 2 中的插槽 2。

最好的方法是什么?

我目前这样做:

uint test = 0x02000005;
bool bit_set_for_01 = (test & (1 << 24)) != 0;
bool bit_set_for_02 = (test & (1 << 25)) != 0;

但我觉得这不是最好的做法。

您可以通过编写如下内容使其更具可读性和效率:

public static (int slot, int storage) Storage(int flags)
{
    return ((flags >> 24) & 7, flags & 0xffff);
}

然后:

static void Main()
{
    var item = Storage(0x00000005);
    Console.WriteLine($"Storage: {item.storage}, slot: {item.slot}");

    // Or just for demo:
    Console.WriteLine(Storage(0x01000009));
    Console.WriteLine(Storage(0x02000002));
}

请注意,我正在使用上面的 7,这为您提供了 3 位的插槽存储空间(0..7 插槽编号)。我也在使用 0xffff,它为插槽提供 16 位。

您应该调整这些值以反映您为这两个数字使用的位数。