【问题标题】:Convert js function to python functions does't work将js函数转换为python函数不起作用
【发布时间】:2026-01-25 21:35:01
【问题描述】:

我找到了一个用 js 编写的算法(我不知道如何编码),然后在与一些了解 js 的朋友交谈后尝试将其转换为 python
Javascript

function crack(code) {
	var N = '';
	var M = '';
	
	for(var i = 0; i < code.length; i++) {
		if(i%2 == 0) {
			N += code[i];
		} else {
			M = code[i] + M;
		}
	}
	
	var key = N + M;

	key = window.atob(key);
	key = key.substring(2);
	
	return key;
}

Python

import base64
def crack(code):
    N = ''
    M = ''
    i = 0
    for letter in code:
        i =code.find(letter)
        if i%2 == 0:
            N += code[i]
        else:
            M =code[i] + M
    key = N + M
    key = base64.b64decode(key)
    key = key[2:]
    print key

如您所见,它是相同的代码,但这里的问题却没有给出相同的结果!!
这里要试的字符串是:

N=m=NAobdtHRRHwaOuiU8mvcZhWddH5bZhz1MWzLapyR5nibbhG19ynccl3RBXvediCV5mjcbh2d0HubZhW1cWvLM4j8ACxONwi8

在搜索window.atob一段时间后,发现该方法解码了一串由btoa()方法编码的数据。
然后搜索btoa发现这个方法使用“A-Z”、“a-z”、“0-9”、“+”、“/”和“=”字符来编码字符串。
现在如何使用 python 获得相同的结果??

【问题讨论】:

    标签: javascript python algorithm base64 swap


    【解决方案1】:

    没有。这不是同一个代码。

    for(var i = 0; i < code.length; i++) {
        if(i%2 == 0) {
    

    不一样

    for letter in code:
        i =code.find(letter)
        if i%2 == 0:
    

    如果代码中的所有字母都相同会怎样?

    我没有比这更进一步。

    我建议先进行“文字”翻译,然后尝试对代码进行“Pythonic”修改。

    【讨论】:

      【解决方案2】:

      您正在搜索代码中第一次出现的字母,位于i =code.find(letter) 行中。如果你想要索引,我建议使用enumerate

      结果:

      import base64
      def crack(code):
          N = ''
          M = ''
          i = 0
          for i, letter in enumerate(code):
              if i%2 == 0:
                  N += code[i]
              else:
                  M =code[i] + M
          key = N + M
          key = base64.b64decode(key)
          key = key[2:]
          print key
      

      似乎正确:

      >>> crack('N=m=NAobdtHRRHwaOuiU8mvcZhWddH5bZhz1MWzLapyR5nibbhG19ynccl3RBXvediCV5mjcbh2d0HubZhW1cWvLM4j8ACxONwi8')
      http://egyg33k.blogspot.com.eg/2016/08/8-malwarebytes-anti-malware.html
      

      【讨论】:

      • 非常感谢,这就是答案:D
      • @D4Vinci 如果此答案解决了您的问题,请随时单击投票箭头下方的复选标记将其标记为已接受。谢谢!