如何将这个散列字符串转换为可用字符串?
How can I convert this hashed string to a usable string?
我找到了一个字符串,它可能是在 base64 中散列的。在我尝试过的每种编码中对其进行解码 returns 错误字符。我也无法访问生成它的代码,也无法对其进行逆向工程。
这是 base64:
AAECAR8GxwPJBLsFmQfZB/gIDI0B2AGoArUDhwSSBe0G6wfbCe0JgQr+DAA=
现在,它的长度为 60 字节,并且所有字符都对 base64 有效,如果您有比 base64 更好的猜测,请告诉我!
我也把它转换成一个字节数组,但我真的不知道如何将字节数组转换成不同编码的字符串。也许我可以 运行 为每个循环使用不同的编码打印结果字符串,直到我找到一个真正的文本?
这是《炉石传说》中的新牌组编码。它确实是有效的 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
这很可能是炉石传说特有的自定义结构序列化格式,其中一个字段表示class,其余的是卡牌ID号的映射(我认为这不是public yet) 到卡的数量。如果重新排列格式,您可以清楚地看到一些模式:
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
在新的更新发布之前,我们真的无法了解更多。更新出来后,很容易做实验,导出一张只有一张卡的牌组并比较结果。
以 Tenchi2xh 的答案为基础,我们可以使用 the decklist that comes with the string 来帮助弄清楚数字的含义。
0 1 2 1 31
- 某种 header,可能表示 class、格式和年份
6
- 牌组中出现 1 次的牌数
- 然后有 12 个字节,我们可以将它们解释为 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
- 每个都是一张出现 2x 的卡片
0
- 末尾填充
最后要弄清楚的是那些 16 位数字指的是哪些卡。幸运的是,它并不太复杂,它们只是卡片 "DBF IDs" 的略微修改版本。我在 HearthstoneJSON 上查看了这些内容。从数字 x
中获取 DBF ID 的方法是:
dbfId = (x >> 8) << 7 | (x % 128)
(也就是低7位不变,其余右移1)
例如:967
解码为DBF ID 455
,即Snake Trap。 3326
对应DBF ID 1662
,即鹰角弓
我找到了一个字符串,它可能是在 base64 中散列的。在我尝试过的每种编码中对其进行解码 returns 错误字符。我也无法访问生成它的代码,也无法对其进行逆向工程。
这是 base64:
AAECAR8GxwPJBLsFmQfZB/gIDI0B2AGoArUDhwSSBe0G6wfbCe0JgQr+DAA=
现在,它的长度为 60 字节,并且所有字符都对 base64 有效,如果您有比 base64 更好的猜测,请告诉我!
我也把它转换成一个字节数组,但我真的不知道如何将字节数组转换成不同编码的字符串。也许我可以 运行 为每个循环使用不同的编码打印结果字符串,直到我找到一个真正的文本?
这是《炉石传说》中的新牌组编码。它确实是有效的 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
这很可能是炉石传说特有的自定义结构序列化格式,其中一个字段表示class,其余的是卡牌ID号的映射(我认为这不是public yet) 到卡的数量。如果重新排列格式,您可以清楚地看到一些模式:
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
在新的更新发布之前,我们真的无法了解更多。更新出来后,很容易做实验,导出一张只有一张卡的牌组并比较结果。
以 Tenchi2xh 的答案为基础,我们可以使用 the decklist that comes with the string 来帮助弄清楚数字的含义。
0 1 2 1 31
- 某种 header,可能表示 class、格式和年份6
- 牌组中出现 1 次的牌数- 然后有 12 个字节,我们可以将它们解释为 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
- 每个都是一张出现 2x 的卡片
0
- 末尾填充
最后要弄清楚的是那些 16 位数字指的是哪些卡。幸运的是,它并不太复杂,它们只是卡片 "DBF IDs" 的略微修改版本。我在 HearthstoneJSON 上查看了这些内容。从数字 x
中获取 DBF ID 的方法是:
dbfId = (x >> 8) << 7 | (x % 128)
(也就是低7位不变,其余右移1)
例如:967
解码为DBF ID 455
,即Snake Trap。 3326
对应DBF ID 1662
,即鹰角弓