0

使用 apktool 反编译 apk 时,我发现一个双精度数组被转换为下面的代码。apktool 是如何做到这一点的?

:array_0
 .array-data 0x8
     0xc7t 0x55t 0x9at 0xf4t 0x6dt 0x5bt 0x44t 0x40t
     0xfet 0x6t 0xdat 0x35t 0x7et 0x5bt 0x44t 0x40t
     0xd4t 0x57t 0x45t 0xf8t 0x59t 0x5bt 0x44t 0x40t
     0xf6t 0xe8t 0xaat 0x3et 0x4et 0x5bt 0x44t 0x40t
     0xc7t 0x55t 0x9at 0xf4t 0x6dt 0x5bt 0x44t 0x40t
 .end array-data
4

2 回答 2

1

构建了一个示例程序并对其进行了反编译。数字是双倍的,每行一个。每个双精度都以IEEE754格式编码,LSB 在前。我的数组我们定义为:

double array[]={ 0, 1, 0.5, 2 };

生成的 baksmali 如下所示:

:array_0
.array-data 0x8
    0x0t 0x0t 0x0t 0x0t 0x0t 0x0t 0x0t 0x0t
    0x0t 0x0t 0x0t 0x0t 0x0t 0x0t 0xf0t 0x3ft
    0x0t 0x0t 0x0t 0x0t 0x0t 0x0t 0xe0t 0x3ft
    0x0t 0x0t 0x0t 0x0t 0x0t 0x0t 0x0t 0x40t
.end array-data

由于 1 的 IEEE754 表示是0x3ff0000000000000,我们可以得出结论,双精度数存储在小端 IEEE754 中。

如果您只想转换程序中的数字,您可以使用在线转换器(在此链接中,您的第一个双精度已经输入)。

沙查尔

于 2012-07-09T19:34:04.507 回答
0

您没有提及您是否只是想理解,或者 apktool 是否只是未能为您反编译 APK。如果是后者,我编写了一个名为zzos的“竞争”工具,它可能更适合您。

如果您对格式感兴趣,请理解 Android 包含不止一种浮点格式。浮点数有时以 IEEE 标准格式存储,但有时它们以其他几乎定点格式存储。您引用的“双打”的确切含义实际上取决于它们的来源以及它们的编码方式。

尝试理解这些的最简单方法是在您的 APK 上运行“aapt d --values resources apkfile ”,并在那里搜索值。如果您将结果的相关部分粘贴到此处,我们可以尝试帮助您准确了解正在发生的事情,我可以尝试将您指向正确的编码位置。

沙查尔

于 2012-07-08T19:52:40.003 回答