gpt4 book ai didi

javascript - Javascript 到 Python 的解压例程

转载 作者:行者123 更新时间:2023-12-01 03:39:49 25 4
gpt4 key购买 nike

我正在尝试将 javascript 文件解压缩例程重写为 python。但我似乎无法正确理解。在 python 上,该函数始终返回 None

这是原始的JS:

var c = new Uint8Array(b),
d = 0,
e = new Uint32Array(4096),
f = new Uint32Array(4096),
g = 256,
h = a.length,
k = 0,
l = 1,
m = 0,
n = 1;
c[d++] = a[0];
for (var r = 1;; r++) {
n = r + (r >> 1);
if (n + 1 >= h) break;
var m = a[n + 1],
n = a[n],
p = r & 1 ? m << 4 | n >> 4 : (m & 15) << 8 | n;
if (p < g)
if (256 > p) m = d, n = 1, c[d++] = p;
else
for (var m = d, n = f[p], p = e[p], q = p + n; p < q;) c[d++] = c[p++];
else if (p == g) {
m = d;
n = l + 1;
p = k;
for (q = k + l; p < q;) c[d++] = c[p++];
c[d++] = c[k]
} else break;
e[g] = k;
f[g++] = l + 1;
k = m;
l = n;
g = 4096 <= g ? 256 : g
}
return d == b ? c : null

这是我的Python实现,我做错了什么? (使用 @le_m 答案进行了改进,但仍然返回 None。)

c = [0] * b
d = 0
e = [0] * 4096
f = [0] * 4096
g = 256
h = len(a)
k = 0
l = 1
m = 0
n = 1

c[d] = a[0]
d += 1

r = 1
while True:
n = r + (r >> 1)
if (n + 1) >= h:
break
m = a[n + 1]
n = a[n]
p = (m << 4 | n >> 4) if r & 1 else ((m & 15) << 8 | n)
if (p < g):
if (256 > p):
m = d
n = 1
c[d] = p
d += 1
else:
m = d
n = f[p]
p = e[p]
q = p + n
while p < q:
c[d] = c[p]
d += 1
p += 1
elif p == g:
m = d
n = 1 + 1
p = k

q = k + l
while p < q:
c[d] = c[p]
d += 1
p += 1
else:
break

e[g] = k
f[g] = l + 1
g += 1
k = m
l = n
g = 256 if 4096 <= g else g
r += 1

最佳答案

仅浏览代码,我就发现了以下差异:

  • new Uint8Array(b) 转换为 [0] * b,因为类型化数组是用零初始化的。对于其他类型化数组也是如此。
  • c[d++] = a[0] 转换为 c[d] = a[0] 后跟 d += 1 ,而不是相反。其他后增量也同样如此。
  • 循环计数器 r += 1 应转到循环体的末尾,或者应使用 0 进行初始化。

我建议使用调试器(浏览器的 JavaScript 开发者控制台)逐步完成这两种实现,并比较变量值。

关于javascript - Javascript 到 Python 的解压例程,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/43987791/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com