2015-04-04 3 views
0

У меня есть база данных для видеоигры, и я храню элементы видеоигр в столбце varbinary (3792). Я пытаюсь сделать программу для редактирования и создания элементов, которые представлены в виде шестнадцатеричной строки длиной 32 строки. Довольно легко создавать элементы, поскольку я знаю, что каждая из позиций в шестнадцатеричной строке представляет с точки зрения свойств элементов, однако моя проблема берет шестую строку и выводит свойства элементов из нее, поскольку некоторые из свойств имеют одну и ту же позицию в шестнадцатеричной строки ..Получение информации из шестнадцатеричной строки

Рассмотрим следующую строку: шестигранный

индекс:... шестигранной: 0000120B837A00000010000000000000

Моя проблема у меня есть 3 разные свойства: уровень, удачи и мастерства.

Удача булево и добавляет 4 в положение 3 или иначе 0.

навык является логическим и добавляет 8 в положение 2 или иначе 0.

Level является ИНТ и использует положение 2 и 3. Каждый раз добавляет 8.

Пример позиция 2,3 может быть: FC

=> Уровень 15 (8 * 15 = 120 до Pos 2,3) + умение (от 8 до поз 2) + (4 удачи в поз 3)

Итак, мой вопрос, учитывая шестую строку и глядя на позиции 2,3, как я могу узнать, какие свойства содержатся, когда несколько свойств используют одни и те же позиции? Я новичок в hex/binary systems, поэтому прошу прощения, если я пропустил некоторую информацию. Я также пытаюсь добиться этого на C# или Java.

ответ

0

Не могли бы вы использовать дополнительные столбцы в таблице базы данных, чтобы помочь вам в расчетах? Каждый раз, когда значения редактируются, вы можете использовать счетчики для уровня, навыка и удачи и легко находить каждую сумму в шестнадцатеричном значении.

+0

Дизайн базы данных не принадлежит моей игре, поэтому я не мог изменить дизайн в любом случае без существенного изменения кода игры, к которому у меня нет доступа. Я просто пытаюсь создать программу для редактирования и создания тезисов. – joe

0

Вам нужно будет сделать немного бинарной математики. Для этого проще использовать java BigInteger, а не шестую строку. Предполагая, что вы рассчитываете позицию слева и начать отсчет с 1:

public static void main(String[] args) { 

    String s = "0FC0120B837A00000010000000000000"; // FC in pos 2,3 
    BigInteger num = new BigInteger(s, 16); 

    int level = num.shiftRight(29*4+3).intValue() & 0b1111; 
    int luck = num.shiftRight(29*4+2).intValue() & 1; 
    int skill = num.shiftRight(30*4+3).intValue() & 1; 

    System.out.printf("level: %s, luck: %s, skill: %s%n", level, luck, skill); 
} 

Давайте возьмем один из них, кроме:

int level = num.shiftRight(29*4+3).intValue() & 0b1111;

  • 29 основывается позиция 0 для уровня с правой стороны (32 - 3 =)
  • 4 - количество бит в 1 шестнадцатеричной цифре
  • 3 - количество бит смещения в позиции для этого поля. уровень умножается на 8 и 8 = 2^, поэтому смещение равно 3 битам.
  • 0b1111 - это маска, представляющая, сколько бит входит в эту переменную. Поскольку уровень сохраняется как 4 бита (0-15), маска равна 0b1111. Мы могли бы представить тот же номер, что и (1 << 4) - 1, где 4 - количество бит.
Смежные вопросы