2017-05-15 13 views
0

私はjavascriptファイル解凍ルーチンをPythonに書き直そうとしています。しかし、私はそれを正しくするように見えることはできません。関数は常にNoneをpythonに返します。ここでJavascriptからPythonへの解凍ルーチン

がオリジナル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答えを改善したが、まだなしを返していない)だけでコードを一瞥から

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 
+0

どのような美しいコード。あなたは*正しいvariabeの名前*を聞いたことがありますか? –

+2

解凍コードを圧縮しないでください;) –

答えて

2

、私は次のような違いを見分ける:型指定された配列が初期化されるよう

  • new Uint8Array(b)[0] * bに変換しますゼロで。他の型付き配列も同じです。
  • c[d++] = a[0]は、c[d] = a[0]、それに続くd += 1に変換されます。他のポストインクリメントも同様です。
  • ループカウンタr += 1は、ループ本体の最後に移動するか、代わりに0で初期化する必要があります。

デバッガ(JavaScriptのブラウザの開発者コンソール)を使用して、両方の実装を段階的に実行し、変数値を比較することをおすすめします。

+0

こんにちは、私はあなたの推薦を反映するために質問のコードを更新しました。はい、私は両方のステップをデバッガ(または単にログ)を介して値を確認するステップを考えていた。 :D – majidarif

+0

@majidarif正しくアップグレードしなかった。最初のステートメントは、前述の 'Uint8Array(b)'だけでなく、すべての型付き配列を保持します。例えば。 'new Uint32Array(4096)'も '[0] * 4096'に変換されます。 3番目の声明では、2つの排他的な変更を推奨しています。 –

+0

はい、申し訳ありません私はちょうど実現しました。また、私はLを1に、LをLに変えていることがわかりました。今も改善されていますが、まだありません。関数を呼び出す部分を含めるべきでしょうか? – majidarif

関連する問題