如何检查某个 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 位。
您应该调整这些值以反映您为这两个数字使用的位数。
我做了一些逆向工程。有一个 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 位。
您应该调整这些值以反映您为这两个数字使用的位数。