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

2016-08-19 18:12:10 +08:00
 Jolly23

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

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", "请联系 i@ilcl.me");    // <--带入了加密的字符串

console.log(t);    //211120161104527

正确结果应该是:211120161104527
1457 次点击
所在节点    问与答
7 条回复
Jolly23
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"请联系 i@ilcl.me")
kindjeff
2016-08-19 18:36:56 +08:00
>因为 js 列表索引 NaN 也有值,在 py 中我用 temp 来替代这个值,但是由于 n[r] 和 n[i]是否有数,导致这条语句用 py 怎么也复现不了

这句话是什么意思
Jolly23
2016-08-19 18:42:52 +08:00
@kindjeff
n[r] + n[i]
其中 n[i]可能为 undef 或者 NaN ,我不太清楚 js 中这两种情况的变量执行 + int 操作,是什么样的结果
kindjeff
2016-08-19 18:47:30 +08:00
不论怎么加减乘除都是 NaN 呀,然后 a[o]和 NaN 异或一下还是 a[o]
prefere
2016-08-19 18:48:55 +08:00
a = NaN
b= a + 1
>>NaN
c = undefined
d = c + 1
>>NaN
没看懂,你是想问这个吗?
Jolly23
2016-08-19 18:51:07 +08:00
@prefere 是的
Jolly23
2016-08-20 01:52:17 +08:00
翻译啊翻译

这是一个专为移动设备优化的页面(即为了让你能够在 Google 搜索结果里秒开这个页面),如果你希望参与 V2EX 社区的讨论,你可以继续到 V2EX 上打开本讨论主题的完整版本。

https://www.v2ex.com/t/300489

V2EX 是创意工作者们的社区,是一个分享自己正在做的有趣事物、交流想法,可以遇见新朋友甚至新机会的地方。

V2EX is a community of developers, designers and creative people.

© 2021 V2EX