V2EX = way to explore
V2EX 是一个关于分享和探索的地方
现在注册
已注册用户请  登录
V2EX 提问指南
Jolly23
V2EX  ›  问与答

哪位大神帮忙把这个 js 的一段函数翻译成 python,一起研究下

  •  
  •   Jolly23 · 2016-08-19 18:12:10 +08:00 · 1503 次点击
    这是一个创建于 3020 天前的主题,其中的信息可能已经有所发展或是发生改变。

    已经翻译了大部分,在后段落遇到了难题:

    function i(e, t) {
    
        var n = new Array(256);
    
        var a = new Array(e.length);
    
        var r, i = "", o, s, c;
    
        for (r = 0; r < 256; r++) {
    
            n[r] = r;
    
            i = (i + n[r] + t.charCodeAt(r % t.length)) % 256;
    
            s = n[r];
    
            n[r] = n[i];
    
            n[i] = s;
    
        }
    
        for (r = 0; r < e.length; r++) {
    
            a[r] = e.charCodeAt(r);
    
        }
    
        for (o = 0; o < a.length; o++) {
    
            r = (r + 1) % 256;
    
            i = (i + n[r]) % 256;
    
            s = n[r];
    
            n[r] = n[i];
    
            n[i] = s;
    
            c = (n[r] + n[i] % 256) % 256;    // <-----------------翻译到这了,在这里卡住了,因为js列表索引NaN也有值,在py中我用temp来替代这个值,但是由于n[r] 和 n[i]是否有数,导致这条语句用py怎么也复现不了。
    
            a[o] = String.fromCharCode(a[o] ^ n[c]);
    
        }
    
        return a.join("");
    
    }
    
    var t = i("21\\1²0g611Ü4\u0012\u00057", "请联系 [email protected]");    // <--带入了加密的字符串
    
    console.log(t);    //211120161104527
    
    正确结果应该是:211120161104527
    
    7 条回复    2016-08-20 01:52:17 +08:00
    Jolly23
        1
    Jolly23  
    OP
       2016-08-19 18:25:40 +08:00
    def test(e, t):
    n = []
    for i in range(256):
    n.append(None)

    a = []
    for i in range(len(e)):
    a.append(None)

    i = 0
    for r in range(256):
    n[r] = r
    i = (i + n[r] + ord(t[r % len(t)])) % 256
    s = n[r]
    n[r] = n[i]
    n[i] = s

    for r in range(len(e)):
    a[r] = ord(e[r])


    r = len(e)
    for o in range(len(a)):
    r = (r + 1) % 256

    try:
    i = (i + n[r]) % 256
    except TypeError:
    i = None

    s = n[r]

    if i:
    n[r] = n[i]
    else:
    n[r] = None

    temp = 0
    if i:
    n[i] = s
    else:
    temp = s

    #c = (n[r] + n[i] % 256) % 256 这句 js 码通不过,搞不对
    #####
    。。。。。
    #####
    test(u"21\\1²0g611Ü4\u0012\u00057", u"请联系 [email protected]")
    kindjeff
        2
    kindjeff  
       2016-08-19 18:36:56 +08:00
    >因为 js 列表索引 NaN 也有值,在 py 中我用 temp 来替代这个值,但是由于 n[r] 和 n[i]是否有数,导致这条语句用 py 怎么也复现不了

    这句话是什么意思
    Jolly23
        3
    Jolly23  
    OP
       2016-08-19 18:42:52 +08:00
    @kindjeff
    n[r] + n[i]
    其中 n[i]可能为 undef 或者 NaN ,我不太清楚 js 中这两种情况的变量执行 + int 操作,是什么样的结果
    kindjeff
        4
    kindjeff  
       2016-08-19 18:47:30 +08:00
    不论怎么加减乘除都是 NaN 呀,然后 a[o]和 NaN 异或一下还是 a[o]
    prefere
        5
    prefere  
       2016-08-19 18:48:55 +08:00
    a = NaN
    b= a + 1
    >>NaN
    c = undefined
    d = c + 1
    >>NaN
    没看懂,你是想问这个吗?
    Jolly23
        6
    Jolly23  
    OP
       2016-08-19 18:51:07 +08:00
    @prefere 是的
    Jolly23
        7
    Jolly23  
    OP
       2016-08-20 01:52:17 +08:00
    翻译啊翻译
    关于   ·   帮助文档   ·   博客   ·   API   ·   FAQ   ·   实用小工具   ·   3325 人在线   最高记录 6679   ·     Select Language
    创意工作者们的社区
    World is powered by solitude
    VERSION: 3.9.8.5 · 25ms · UTC 12:45 · PVG 20:45 · LAX 04:45 · JFK 07:45
    Developed with CodeLauncher
    ♥ Do have faith in what you're doing.