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

问题描述

我有以下代码

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 项目。在主活动中添加一个方法并粘贴您想要的 smali 代码的 java 代码。现在将应用编译为 APK 并在 Jadx 中打开它。选择你已经添加方法切换到 Smali 视图的活动类。现在您可以简单地复制 samli 代码,可能只需要修改一些寄存器(例如,在这种情况下,v4 寄存器具有 byte[] 输入。