干净分析和处理整数

问题描述 投票:1回答:1

我逆向工程的老游戏格式。为他们的纹理,它们存储在一个单一的整数显示类型信息。我最初虽然不同的位是布尔标志。例如,如果位1被设置,所述纹理是透明的。我越已经通过不同的显示类型的工作,少我觉得是这样的。所以,现在我处理他们刚刚全部整数。

下面是一些示例数据:

1. When the texture is invisible, the flag integer is 0.
2. Diffuse          - flag integer: -2147483647. Hex: 0x80000001
3. Semi Transparent - flag integer: -2147483643. Hex: 0x80000005
4. Masked           - flag integer: -2147483629, Hex: 0x80000013 

有相当多的更多类型的,他们有自己独特的整数值为好。

什么是处理这种数据的最简单的方法?与巨大的负整数的if / else语句是超级难看,难以阅读。它看起来像它会更容易对它们进行分析为十六进制值,但每个if / else语句需要像这样的int.Parse声明:

if (parameters == int.Parse("0x80000001", NumberStyles.HexNumber))
{
    // Handle this case            
}

是否有这样做并分析数据的任何其他建议干净的方式?是否有可能只是分析的十六进制值莫名其妙的结束了吗?

c# type-conversion hex reverse-engineering
1个回答
1
投票

有相当多的更多类型的,他们有自己独特的整数值,以及...什么是处理这个数据最简单的方法?

你所描述被称为幻数。即无论何时你的代码需要处理任意几乎是随机数,它是并不清楚它们的含义。

对付它们的最好方法就是将其定义为常量一旦与意见,然后在代码中使用常量,而不是整个代码库重复“丑陋”的数字。

也许是这样的:

public static class TextureConstants
{
    // TODO comments
    public static int Diffuse = -2147483647;
    public static int SemiTransparent = -2147483643;
    public static int Masked= -2147483629;
}

也是他们之所以没有上述已经不能用enum做,但如果你打算做大量int比较,有比较int需要enum讨厌铸造。

与巨大的负整数的if / else语句是超级难看,难以阅读

稍后,您可以在ifswitch语句中使用它像这样:

switch (someNumber)
{
    case TextureConstants.Diffuse:
        // do something
        break;

    case TextureConstants.SemiTransparent:
        // do something
        break;

    case TextureConstants.Masked:
        // do something
        break;
}

字典

如果你不喜欢switch语句,你可以使用一个Dictionary<>

public enum Textures
{
    Diffuse,
    SemiTransparent,
    Masked
}

// initialise the dictionary
Dictionary<int, Textures> dict;
dict[TextureConstants.Diffuse] = Textures.Diffuse;
dict[TextureConstants.SemiTransparent] = Textures.SemiTransparent;
dict[TextureConstants.Masked] = Textures.Masked;

int someNumber = // ...
if (dict.TryGetValue (someNumber, out var texture))
{
    // got one
    if (texture == Textures.Diffuse) // ...
}
© www.soinside.com 2019 - 2024. All rights reserved.