Чистый анализ и обработка целых чисел - PullRequest
0 голосов
/ 05 февраля 2019

Я реверс-инжиниринг старого игрового формата.Для своих текстур они хранят информацию о типе дисплея в одном целом числе.Я изначально, хотя разные биты были логическими флагами.Например, если был установлен бит 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            
}

Есть ли какой-либо другой чистый способ сделать это и проанализироватьданные?Можно ли как-то просто проанализировать конец шестнадцатеричного значения?

1 Ответ

0 голосов
/ 05 февраля 2019

Есть еще несколько типов, и у них есть свои уникальные целочисленные значения ... Какой самый простой способ обработки этих данных?

Что вы описываете, так этоизвестный как магические числа .т. е. всякий раз, когда ваш код должен иметь дело с произвольными почти случайными числами, и неясно, что они означают.

Лучший способ справиться с ними - определить их как константы один раз с комментариями, а затем использовать константы в коде вместо повторения "уродливых" чиселпо всей базе кода.

Возможно, что-то вроде:

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;
}

Словарь

Если вам не нравится *Вы можете использовать 1037 * операторов 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) // ...
}
...