从十六进制字符串中获取信息

时间:2015-04-04 01:20:15

标签: java c# hex

我有一个视频游戏数据库,我将视频游戏项目存储在varbinary(3792)列中。我试图制作一个程序来编辑和创建32长十六进制字符串形式的项目。创建项目相当容易,因为我知道十六进制字符串中的每个位置代表项属性,但我的问题是采用十六进制字符串并从中获取项属性,因为一些属性在十六进制字符串中共享相同的位置..

考虑以下十六进制字符串:

指数:012345 ...... 十六进制:0000120B837A00000010000000000000

我的问题是我有3种不同的属性:等级,运气和技能。

运气是一个布尔值,将4加到位置3,否则为0。

技能是一个布尔值,将8加到位置2,否则为0。

Level是一个int并使用位置2和3.每次添加8。

示例位置2,3可以是:FC

=>等级15(8 * 15 = 120到位2,3)+技能(8到2位)+运气(4到位3)

所以我的问题是,给定一个十六进制字符串并查看位置2,3当多个属性使用相同的位置时,我怎么可能知道包含哪些属性?我是十六进制/二进制系统的新手,所以如果我错过了一些信息,我会道歉。我也试图用C#或Java实现这一点。

2 个答案:

答案 0 :(得分:0)

您是否可以在数据库表中使用其他列来帮助您进行计算?每次编辑值时,您都可以使用计数器进行等级,技能和运气,并轻松找到十六进制值中的每个数量。

答案 1 :(得分: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 = 29
  • 4是1个十六进制数字中的位数
  • 3是此字段位置内的偏移位数。 level乘以8和8 = 2 ^ 3 ,因此偏移量为3位。
  • 0b1111是表示进入此变量的位数的掩码。由于级别存储为4位(0-15),因此掩码为0b1111。我们可以表示与(1 << 4) - 1相同的数字,其中4是位数。