iT邦幫忙

0

kotlin 轉成 python

  • 分享至 

  • twitterImage
    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嗎
測試完全不懂是怎麼走的

看更多先前的討論...收起先前的討論...
黃彥儒 iT邦高手 1 級 ‧ 2020-11-10 14:23:55 檢舉
1000要嗎?
dragonH iT邦超人 5 級 ‧ 2020-11-10 14:36:05 檢舉
import os

def main():
files = list(filter(lambda file: file.endswith('.kt'), os.listdir('.')))
for file in files:
filename = file.split('.')[0]
os.rename(file, f'{filename}.py')

if __name__ == '__main__':
main()
s4028600 iT邦新手 5 級 ‧ 2020-11-10 14:43:15 檢舉
因為只是想知道各行的意思,沒有一定要花錢改的執著(雖然也有想花錢請求,但感覺我執著不夠…)
如果一定要錢,那還是讓我把發問取消吧
不過還是感謝回應
s4028600 iT邦新手 5 級 ‧ 2020-11-10 14:57:06 檢舉
@dragonH
你這只是換副檔名而已……
不過程式碼比我自己寫的簡潔多了
ant1017 iT邦新手 2 級 ‧ 2020-11-10 16:24:06 檢舉
怎麼不找個時間去玩一下python就知道了...
都有概念了,去熟悉新語言其實不難
ckp6250 iT邦好手 1 級 ‧ 2020-11-10 16:37:59 檢舉
題外話,
若真有需要的話,黃兄開的1000是很便宜的,
卅年前,我花了四千元,買了七行程式碼,
我很開心,因為花了一個禮拜搞不定,四千元就解決了。

後來,我就學會了【花錢買時間】的這個觀念。

幾年前,我在開發票子發票時,有一個環節卡關,網路上找了好久找不到,幸運地遇到一位大德協助,其實關鍵碼沒有幾個字,他覺得沒有什麼,不願意收我錢,我就每年年終寄伴手禮去給他,聊表心意。

我沒什麼志氣,缼乏愚公移山的精神和勇氣,如果遇到了問題自行摸索很久弄不出來時,我就想花錢找人幫我解決,因為大部份的問題都是缺乏臨門一腳,有人示範了這一腳後,其他的問題也就迎刃而解。
s4028600 iT邦新手 5 級 ‧ 2020-11-10 16:41:02 檢舉
@ant1017
反了
我完全看不懂kotlin
試圖轉成我看的懂的python(雖然也很糟)
s4028600 iT邦新手 5 級 ‧ 2020-11-10 16:50:26 檢舉
@ckp6250
我想也是,但畢竟我不是工作或商業性質,比較接近好奇心,所以沒有花錢買程式碼的執著
雖然有想要的程式碼,但是目前沒有必要(或者說沒cp值沒錢,以後才可能要或有錢)

花錢也要有門路
話說這種請人寫程式碼的都是去哪裡找?
ccutmis iT邦高手 2 級 ‧ 2020-11-10 17:07:41 檢舉
如果你是想要把kt的物件轉成python物件,給你一個範例參考:

class MyClass:
 """ 建構式 """
 def __init__(self,tmp_url=''):
  self.my_url=tmp_url #物件的屬性
 """ 物件的方法 """
 def url_encode(self,tmp_str):
  return tmp_str.replace("+","%20").replace("%7E", "~").replace("*", "%2A")

aa=MyClass('http://www.google.com.tw?a=3+5&b=%7E0.0&c=***')
print('old:',aa.my_url)
aa.my_url=aa.url_encode(aa.my_url)
print('new:',aa.my_url)

你問的這個,找本Python基礎入門的書好好啃一啃,裡面的範例照打幾遍,基礎打好之後大概都能寫出來,遇到寫不出來的部份功能再來提問,我想邦友們會很樂意給建議的
s4028600 iT邦新手 5 級 ‧ 2020-11-10 18:22:41 檢舉
@ccutmis
你寫的不太對……
雖然我的很簡陋
import urllib.parse
url=''
print(urllib.parse.quote(url).replace("+","%20").replace("%7E", "~").replace("*", "%2A"))
他可能有中文,所以需要轉碼

我的問題是kotlin看不懂,沒有kotlin轉python的範例
ccutmis iT邦高手 2 級 ‧ 2020-11-10 20:41:03 檢舉
@s4028600:
private fun urlEncode 那個函式裡的 把+用%20替換這類的主要用來處理網址裡面一些不該有的符號(這個就叫 Url Encode),跟是不是有中文沒關係,可以去google一下'url encode %20'
s4028600 iT邦新手 5 級 ‧ 2020-11-11 11:45:07 檢舉
import hashlib
m = hashlib.md5()
data = ""
m.update(data.encode("utf-8"))
h = m.hexdigest()
print(h)

只剩一個沒電腦用okhttp3來測試
只靠推測改寫不了
s4028600 iT邦新手 5 級 ‧ 2020-11-11 13:26:45 檢舉
@ccutmis
你的程式碼打印出來的結果和轉碼是不一樣的
根據簡易測試轉碼後幾乎用不到取代,反而取代會錯誤……
ccutmis iT邦高手 2 級 ‧ 2020-11-11 21:02:44 檢舉
@s4028600:
實在沒法跟你說什麼,祝您學習順利。
s4028600 iT邦新手 5 級 ‧ 2020-11-13 21:18:24 檢舉
@ccutmis
莫名奇妙,不然解釋一下kotlin中的URLEncoder.encode(str, "UTF-8")
這個不是轉碼是什麼?
您給的程式碼只有取代
沒有辦法解釋為什麼要用到UTF-8編碼
然後在討論的時候突然冒出一句[實在沒法跟你說什麼]
是什麼意思?
我沒實力是沒錯,但我測試只用取代就會錯誤也是事實,沒理由被說成這樣
ccutmis iT邦高手 2 級 ‧ 2020-11-15 00:49:30 檢舉
@s4028600:
URLEncode是做什麼的你懂嗎?
https://baike.baidu.com/item/urlencode/8317412
空格ASCII码是32,对应16进制是20,那么urlencode编码结果是:%20,但在新标准中空格对应的是+,见RFC-1738
這就是你原先提問的Kotlin裡面那個函式要用%20取代+的地方
看到你說"根據簡易測試轉碼後幾乎用不到取代,反而取代會錯誤……"
我只能說"實在沒法跟你說什麼"了。
s4028600 iT邦新手 5 級 ‧ 2020-11-24 14:01:23 檢舉
@ccutmis
我的確是不懂URLEncode
但我糾結的點在於你給的程式碼呈現出來的結果不一樣
我測試中其中一個url "2020-11-24+13:38:19"
經過URLEncode和你的程式碼結果會不同
2020-11-24%2B13%3A38%3A19
2020-11-24%2013:38:19
所以我才推論可能因為有中文,所以需要URLEncode而不是取代

終於搞清楚為什麼你和我在雞同鴨講
我問的是如何將Kotlin以python呈現
你卻以為我問為什麼要用%20取代+
圖片
  直播研討會
圖片
{{ item.channelVendor }} {{ item.webinarstarted }} |
{{ formatDate(item.duration) }}
直播中

1 個回答

0
海綿寶寶
iT邦大神 1 級 ‧ 2020-11-11 12:21:49
最佳解答

如果題目改成「請問這三段 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()
}
s4028600 iT邦新手 5 級 ‧ 2020-11-11 13:34:26 檢舉

喔喔,好理解很多,有輸入和輸出的範例感謝

generateGSNHash要測試,感覺應該是字典排序後處理,我字典不常用……
hash怎麼差那麼多,改成python程式碼超短

我要發表回答

立即登入回答