我有一个视频游戏数据库,我将视频游戏项目存储在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实现这一点。
答案 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是位数。