我逆向工程的老游戏格式。为他们的纹理,它们存储在一个单一的整数显示类型信息。我最初虽然不同的位是布尔标志。例如,如果位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
}
是否有这样做并分析数据的任何其他建议干净的方式?是否有可能只是分析的十六进制值莫名其妙的结束了吗?
有相当多的更多类型的,他们有自己独特的整数值,以及...什么是处理这个数据最简单的方法?
你所描述被称为幻数。即无论何时你的代码需要处理任意几乎是随机数,它是并不清楚它们的含义。
对付它们的最好方法就是将其定义为常量一旦与意见,然后在代码中使用常量,而不是整个代码库重复“丑陋”的数字。
也许是这样的:
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<>
:
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) // ...
}