2015-04-04 22 views
0

我有一個視頻遊戲數據庫,並將視頻遊戲項存儲在varbinary(3792)列中。我試圖編寫一個程序來編輯和創建32長度的十六進制字符串形式的項目。創建項目相當容易,因爲我知道每個十六進制字符串中的每個位置代表項目屬性,但是我的問題是使用十六進制字符串並從中獲取項目屬性,因爲某些屬性共享相同的位置在十六進制字符串..從十六進制字符串派生信息

考慮下面的十六進制字符串:

指數:... 十六進制:0000120B837A00000010000000000000

我的問題是我有3個不同的屬性:等級,運氣和技巧。

運氣是一個布爾,並增加了4到位置3或否則爲0。

技能是布爾,並增加了8到位置2或否則爲0。

等級是一個int和使用位置2和3.每次添加8個。

實施例2,3位置可以是:FC

=>等級15(8 * 15 = 120到POS 2,3)+技能(8到POS 2)+運氣(4至POS 3)

所以我的問題是,給定一個十六進制字符串,並查看位置2,3我怎麼可能知道當多個屬性使用相同的位置時包含哪些屬性?我是新來的十六進制/二進制系統,所以我很抱歉如果我錯過了一些信息。我也試圖在C#或Java中實現這一點。

回答

0

您可以使用數據庫表中的其他列來幫助您進行計算嗎?每次編輯值時,都可以使用等級,技能和運氣計數器,並輕鬆定位每個金額的十六進制值。

+0

數據庫設計不是我的遊戲使用的,所以我無法改變設計,無法顯着改變我無法訪問的遊戲代碼。我只是想製作一個程序來編輯和創建這些項目。 – joe 2015-04-04 01:32:20

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是比特數。