【问题标题】:Deriving information from hex string从十六进制字符串派生信息
【发布时间】:2015-06-09 02:34:52
【问题描述】:

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

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

索引:012345... 十六进制:0000120B837A00000010000000000000

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

Luck 是一个布尔值,在位置 3 上加 4,否则为 0。

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

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

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

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

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

【问题讨论】:

    标签: java c# hex


    【解决方案1】:

    你必须做一些二进制数学。为此,使用 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 是位数。

    【讨论】:

      【解决方案2】:

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

      【讨论】:

      • 游戏使用的数据库设计不是我的,所以无论如何我都无法在不大幅更改我无法访问的游戏代码的情况下更改设计。我只是想制作一个程序来编辑和创建这些项目。
      猜你喜欢
      • 2010-10-04
      • 2014-03-07
      • 2019-07-27
      • 2021-07-07
      • 1970-01-01
      • 1970-01-01
      • 2018-01-31
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多