如何将字节数组转换为十六进制字符串?

How to convert a byte array to hex string?

我有以下代码:

sget-object v5, Lkotlin/text/Charsets;->UTF_8:Ljava/nio/charset/Charset;

invoke-static {v4, v2}, Ljava/util/Objects;->requireNonNull(Ljava/lang/Object;Ljava/lang/String;)Ljava/lang/Object;

invoke-virtual {v4, v5}, Ljava/lang/String;->getBytes(Ljava/nio/charset/Charset;)[B

move-result-object v4

现在我需要将 v4 转换为十六进制字符串,以便将其登录到 Android Studio 中的 Logcat,因为我无法记录字节。 我该怎么做?

byte[] 转换为 String 的简单方法是使用 BigInteger:

String s = new BigInteger(1, data).toString(16);

在smali中你需要两个额外的寄存器(或者两个可以被覆盖的寄存器)。在下面的代码中,使用了 v1v2。字节数组必须存在于 v4:

new-instance v1, Ljava/math/BigInteger;

const/4 v2, 0x1  # interpret the byte array as positive number

invoke-direct {v1, v2, v4}, Ljava/math/BigInteger;-><init>(I[B)V

const/16 v2, 0x10     # Output base 16 = hexadeximal

invoke-virtual {v1, v2}, Ljava/math/BigInteger;->toString(I)Ljava/lang/String;

move-result-object v1

# The hex-string is now in v1

# Let's log the value
const-string v2, "TAG"

invoke-static {v2, v1}, Landroid/util/Log;->d(Ljava/lang/String;Ljava/lang/String;)I

有一个非常简单的方法可以自己生成这样的smali代码:

使用您拥有 Android Studio 源代码的任何应用,或使用 Android Studio 创建一个新的 Android 项目。在mainactivity中添加一个方法,然后粘贴你想要smali代码的java代码。现在将应用程序编译为 APK 并在 Jadx 中打开它。选择activity class你添加的方法切换到Smali视图。现在您可以简单地复制 samli 代码,可能只需要修改一些寄存器(例如,在这种情况下,具有 byte[] 输入的 v4 寄存器。