如何将字节数组转换为十六进制字符串?
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中你需要两个额外的寄存器(或者两个可以被覆盖的寄存器)。在下面的代码中,使用了 v1
和 v2
。字节数组必须存在于 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
寄存器。
我有以下代码:
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中你需要两个额外的寄存器(或者两个可以被覆盖的寄存器)。在下面的代码中,使用了 v1
和 v2
。字节数组必须存在于 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
寄存器。