2017-05-16 50 views
0

我有一个字符串,我发现,这可能是散列在base64。解码它会在我尝试过的每种编码中返回错误字符。我也无法访问生成它的代码,也无法对其进行反向工程。如何将此散列字符串转换为可用的字符串?

这是BASE64: AAECAR8GxwPJBLsFmQfZB/gIDI0B2AGoArUDhwSSBe0G6wfbCe0JgQr+DAA=

现在,它的60字节长,并且所有字符都是有效的的base64,如果你有更好的猜测比的base64通知我!

我也已经将它转换成一个字节数组,但我真的不知道如何将字节数组转换为不同编码的字符串。也许我可以运行一个for each循环,以不同的编码打印结果字符串,直到我找到一个实际的文本?

+0

在附注中,生成此代码的原始程序是使用统一引擎的游戏。 – voidblaze

+0

它可能在一个你不指望的字符集编码,当你说你“找到”字符串,没有理由它应该是人类可读的。它可能只是任何二进制数据! – TomTom101

回答

5

这是来自Hearthstone的新套牌编码。它确实是有效的base64,它永远不会翻译成纯文本。

$ echo 'AAECAR8GxwPJBLsFmQfZB/gIDI0B2AGoArUDhwSSBe0G6wfbCe0JgQr+DAA=' | base64 -D | od -t u1 
0000000  0 1 2 1 31 6 199 3 201 4 187 5 153 7 217 7 
0000020 248 8 12 141 1 216 1 168 2 181 3 135 4 146 5 237 
0000040  6 235 7 219 9 237 9 129 10 254 12 0 
0000054 

这可能是特定的炉石指示类的自定义结构序列化格式,与现场,其余的被卡ID号的映射(我不认为是公开的还)达的牌。你可以清楚地看到一些模式,如果你重新安排格式:直到新的更新发布,我们无法真正知道更多

0 1 
    2 1 
    31 6 
199 3 
201 4 
187 5 
153 7 
217 7 
248 8 
    12 
141 1 
216 1 
168 2 
181 3 
135 4 
146 5 
237 6 
235 7 
219 9 
237 9 
129 10 
254 12 
    0 

。更新结束后,将很容易进行试验,导出一张卡片并对结果进行比较。

+0

非常感谢,现在它很有意义。我期望像一个JSON对象。如果我可能会问,你用什么将字符串从base64转换为可读的? – voidblaze

+0

在这个例子中,我使用了bash命令:'base64'和'od'。 'od'就像一个十六进制查看器,除了你可以选择显示文件的格式,如十六进制,十进制,C符号等。 – Tenchi2xh

+0

特别是,通过'od -t u1'管道文件将会显示每个无符号十进制字节。 顺便说一句,如果你有兴趣,我做了一个非常基本的Python解析器的甲板代码灵感来自@蒂姆的回应 – Tenchi2xh

4

建立在Tenchi2xh的答案上,我们可以使用the decklist that comes with the string来帮助找出数字的含义。

  • 0 1 2 1 31 - 某种头,大概指示类,格式,和年
  • 6 - 在甲板
  • 然后有12个字节出现1X的卡的数量,我们可以解释这些作为6个16位整数:967 1225 1467 1945 2009 2296 - 每个这些是出现1X在甲板一个卡
  • 12 - 的卡的数量,每个在甲板上出现2次
  • 12更多个16位整数:397 472 680 949 1159 1426 1773 2027 2523 2541 2689 3326 - 各自是卡出现2个
  • 0 - 填充在年底

的最后一件事搞清楚的是那些16位数字指的是哪种卡。幸运的是,它并不是太复杂,它们只是卡片“DBF ID”的稍微修改版本。我在HearthstoneJSON看这些。从许多x得到DBF ID的方法是:

dbfId = (x >> 8) << 7 | (x % 128)(或者换句话说,保持最低7位的相同,和右移1的其余部分移动)

例如:967进行解码,以DBF ID 455,这是Snake Trap。 3326对应于DBF ID 1662,它是Eaglehorn Bow。

+0

额外的位可能表示一张黄金卡? –

+0

它可能确实,但我们目前还不知道。示例中的所有卡都将该位设置为1。 – Tim

相关问题