C# 干净地分析和处理整数

C# 干净地分析和处理整数,c#,type-conversion,hex,reverse-engineering,C#,Type Conversion,Hex,Reverse Engineering,我正在逆向工程一个旧的游戏格式。对于其纹理,它们以单个整数存储显示类型信息。我最初认为不同的位是布尔标志。例如,如果设置了位1,则纹理是透明的。我对不同的显示类型研究得越多,我认为这种情况就越少。现在我把它们当作整数来处理 以下是一些示例数据: 1. When the texture is invisible, the flag integer is 0. 2. Diffuse - flag integer: -2147483647. Hex: 0x80000001 3. Se

我正在逆向工程一个旧的游戏格式。对于其纹理,它们以单个整数存储显示类型信息。我最初认为不同的位是布尔标志。例如,如果设置了位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            
}
有没有其他建议的干净的方法来做这件事和分析数据?是否可以以某种方式分析十六进制值的结尾

还有很多类型,它们也有自己唯一的整数值……处理这些数据最简单的方法是什么

你所描述的就是所谓的幻数。i、 当你的代码需要处理任意的几乎是随机的数字,并且它们的含义不清楚时

处理它们的最佳方法是将它们定义为带有注释的常量一次,然后在代码中使用常量,而不是在整个代码库中重复“丑陋”的数字

也许是这样的:

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语句非常难看,而且很难读取

稍后,您可以在
if
switch
语句中使用它,如下所示:

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

    case TextureConstants.SemiTransparent:
        // do something
        break;

    case TextureConstants.Masked:
        // do something
        break;
}
字典 如果不喜欢
switch
语句,可以使用
Dictionary

公共枚举纹理
{
弥漫的,
半透明的,
蒙面
}
//在字典上草签
词典词典;
dict[TextureConstants.Diffuse]=纹理.Diffuse;
dict[TextureConstants.SemiTransparent]=纹理.SemiTransparent;
dict[TextureConstants.Masked]=纹理.Masked;
int someNumber=/。。。
if(dict.TryGetValue(someNumber,out-var纹理))
{
//有一个
如果(纹理==纹理.漫反射)/。。。
}

考虑一个。顺便说一下,除了使用查找词典的建议/答案之外,如果您更喜欢十六进制符号,为什么不使用
uint
而不是
int
?如果您被迫使用
int
,并且更喜欢用十六进制符号和MSB集定义整数值(即负整数),您可以这样做:
unchecked((int)0x8000001)
。我认为这可能是OP需要的更多选项+1@MichaelRandall谢谢你,迈克尔。就回答而言,我认为你的回答相当不错:)
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) // ...
}