Java 从十六进制字符串派生信息

Java 从十六进制字符串派生信息,java,c#,hex,Java,C#,Hex,我有一个视频游戏数据库,我将视频游戏项目存储在varbinary3792列中。我正在尝试制作一个程序来编辑和创建32长度十六进制字符串形式的项目。创建条目相当容易,因为我知道十六进制字符串中的每个位置在条目属性方面代表什么,但是我的问题是获取十六进制字符串并从中派生条目属性,因为一些属性在十六进制字符串中共享相同的位置 考虑以下十六进制字符串: 索引:012345。。。 十六进制:0000120B837A000001000000000000000 我的问题是我有三个不同的属性:等级、运气和技能

我有一个视频游戏数据库,我将视频游戏项目存储在varbinary3792列中。我正在尝试制作一个程序来编辑和创建32长度十六进制字符串形式的项目。创建条目相当容易,因为我知道十六进制字符串中的每个位置在条目属性方面代表什么,但是我的问题是获取十六进制字符串并从中派生条目属性,因为一些属性在十六进制字符串中共享相同的位置

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

索引:012345。。。 十六进制:0000120B837A000001000000000000000

我的问题是我有三个不同的属性:等级、运气和技能

运气是一个布尔值,在第3位加上4,否则为0

Skill是一个布尔值,在位置2上加8,否则为0

级别为整数,使用位置2和3。每次加8

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

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


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

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

您需要进行一些二进制计算。使用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.shiftRight29*4+3.intValue&0b1111

29是从右侧开始的标高基于0的位置32-3=29 4是1个十六进制数字中的位数 3是该字段位置内的偏移位数。电平乘以8,8=2^3,因此偏移量为3位。
0b1111是表示此变量中有多少位的掩码。由于电平存储为4位0-15,因此掩码为0b1111。我们可以用1来表示相同的数字。游戏使用的数据库设计不是我的,因此,如果不大幅更改我无法访问的游戏代码,我无论如何都无法更改设计。我只是想做一个程序来编辑和创建这些项目。