如何将php函数转换为kotlin android?

如何将php函数转换为kotlin android?,php,android,kotlin,Php,Android,Kotlin,我有一个项目正在进行中,它使用一个API进行it请求,但是为了实现它们,我需要首先生成令牌 在API更新之前,一切都正常工作,更新之后,我不知道如何调整代码使其再次工作 这是在更新(Android | Kotlin)之前运行的代码: fun hmacHash(str: String, secret: String): String { val sha256HMAC = Mac.getInstance("HmacSHA256") val secretKey = SecretKey

我有一个项目正在进行中,它使用一个API进行it请求,但是为了实现它们,我需要首先生成令牌

在API更新之前,一切都正常工作,更新之后,我不知道如何调整代码使其再次工作

这是在更新(Android | Kotlin)之前运行的代码:

fun hmacHash(str: String, secret: String): String {
    val sha256HMAC = Mac.getInstance("HmacSHA256")

    val secretKey = SecretKeySpec(secret.toByteArray(), "HmacSHA256")
    sha256HMAC.init(secretKey)

    return convertToHex(sha256HMAC.doFinal(str.toByteArray()))
}

fun convertToHex(data: ByteArray): String {
    val buf = StringBuilder()
    for (b in data) {
        var halfbyte = (b.toInt() shr 4) and (0x0F.toByte()).toInt()
        var two_halfs = 0
        do {
            buf.append(if (halfbyte in 0..9) ('0'.toInt() + halfbyte).toChar() else ('a'.toInt() + (halfbyte - 10)).toChar())
            halfbyte = (b and 0x0F).toInt()
        } while (two_halfs++ < 1)
    }
    return buf.toString()
}
hash_hmac('sha256', $string, $privateKey);
但在更新之后,php代码如下所示:

hash_hmac('sha256', $string, hex2bin($privateKey));

我不知道如何调整我的代码,使之适应新的变化

据我推断,PHP代码做出了这种改变,因为
$privateKey
从纯文本变成了十六进制编码。因此需要
hex2bin
将其改回纯文本(将十六进制编码的文本改为纯文本;如果你问我,这是一个名称混乱的函数)

由于您的
秘密
是纯文本,因此无需更改任何内容来匹配。但是还有其他方法可以改进代码。例如,将字节数组转换为十六进制编码字符串要容易得多

fun hmacHash(str: String, secret: String): String {
    val sha256HMAC = Mac.getInstance("HmacSHA256")

    val bytes = secret.toByteArray()
    val secretKey = SecretKeySpec(bytes, "HmacSHA256")
    sha256HMAC.init(secretKey)

    return convertToHex(sha256HMAC.doFinal(str.toByteArray()))
}

fun convertToHex(data: ByteArray): String =
    data.joinToString("") { "%02x".format(it) }

在Kotlin代码中传递给
hmacHash
secret
中有什么类型的值?它是像
“hello123”
那样的明文还是像
“3a1b4c1d5e9f”
那样的十六进制编码它是作为密码传递的api密钥的值在我的例子中它存储为一个普通的随机字符串值这是我的android代码中的一个示例调用:
hmacHash(${username}:${password}),api_-key)谢谢你的代码建议,比以前好多了。我已经和创建API的开发人员谈过了,我们认为问题在于androids函数
toByteArray
,因为它返回64字节而不是32字节。这就是授权失败的原因。@igoriic如果API_密钥的长度为32个字符,并且只包含ASCII字符,在与他再次交谈后,他说api密钥的编码长度为64个字符,基本上从字符串中提取2个字符将其转换为单字节,以获得32个版本。因此,如果a有一个字符串,比如:
test
我会将
te
转换为byte,将
st
转换为byte,并将它们组合在一起,得到字节数组中的2个项。正如用简单的术语解释的,但从我所能得到的,转换并不是那么简单。