private fun urlEncode(str: String?): String {
return URLEncoder.encode(str, "UTF-8")
.replace("+", "%20")
.replace("%7E", "~")
.replace("*", "%2A")
}
private fun generateGSNHash(url: HttpUrl): String {
var s = c + "GET"
url.queryParameterNames().toSortedSet().forEach {
if (it != "gsm") {
s += it
s += urlEncode(url.queryParameterValues(it)[0])
}
}
s += c
return hashString("MD5", s)
}
private fun hashString(type: String, input: String): String {
val hexChars = "0123456789abcdef"
val bytes = MessageDigest
.getInstance(type)
.digest(input.toByteArray())
val result = StringBuilder(bytes.size * 2)
bytes.forEach {
val i = it.toInt()
result.append(hexChars[i shr 4 and 0x0f])
result.append(hexChars[i and 0x0f])
}
return result.toString()
}
這幾個代碼能幫忙改寫成python嗎
測試完全不懂是怎麼走的
如果題目改成「請問這三段 Kotlin 程式是什麼意思?」的話
以下的回答就比較不會「答非所問」了
先看一下
若想繼續討論或發問再說
//Input : String str
//Output : String
//Process : 將 str 進行 URLEncode 後,並將 +,%7E, * 取代成 %20, ~, %2A 後得到結果字串
private fun urlEncode(str: String?): String
//Input : HttpUrl url
//Output : String
//Process :
private fun generateGSNHash(url: HttpUrl): String {
//s 是用來儲存結果的字串
var s = c + "GET"//設定 s 的初始值,但 c 未定義錯誤
//以參數名稱排序 url 的所有參數後再逐項處理,參數名稱為 gsm 除外不處理
//若以 website=ithelp&date=20201111 為例
//以下迴圈跑完
//s 就會是 websiteurlEncode("ithelp")dateurlEncode("20201111")
url.queryParameterNames().toSortedSet().forEach {
if (it != "gsm") {
s += it
s += urlEncode(url.queryParameterValues(it)[0])
}
}
s += c //s 尾巴再加一次 c, 但 c 未定義錯誤
return hashString("MD5", s)//最後將 s 「加工」(取 MD5 後再加處理)後回傳結果
}
//Input : type String 取 Digest 演算法
//Input : type String 本文字串 input
//Output : String
//Process
private fun hashString(type: String, input: String): String {
val hexChars = "0123456789abcdef"
//以 type(MD5) 方式取得 input 的 Digest 值
val bytes = MessageDigest
.getInstance(type)
.digest(input.toByteArray())
//準備回傳結果字串,大小為 Digest 值大小的兩倍
val result = StringBuilder(bytes.size * 2)
//一個一個地處理 Digest 值
//用 Digest 裡的值,經過轉換成 hexChars 裡的某兩個字元,並加進 result 中
//第一個字元的索引值,是 i 右位移 4 之後 AND 0x0F
//第二個字元的索引值,是 i AND 0x0F
//AND 0x0F 的原因是 hexChars 只有 16(0x00..0x0F) 個字元
bytes.forEach {
val i = it.toInt()//轉整數
result.append(hexChars[i shr 4 and 0x0f])
result.append(hexChars[i and 0x0f])
}
//回傳 result
return result.toString()
}