実現したいこと
pythonプログラムでzlib圧縮された文字列を、javascriptで取得して解凍しようとしているのですが、
うまくいきません。
javascript側でどのようなコードを書けばよいでしょうか?
前提
zlibの解凍はpako.jsを使うつもりです
発生している問題・エラーメッセージ
pako.js:6810 Uncaught incorrect header check
該当のソースコード
pythonの圧縮プログラム
1def zip_str(text: str) -> str: 2 b = zlib.compress(text.encode()) 3 return base64.b85encode(b).decode()
javascriptの解凍プログラム
1function deserialize(serialized_data) 2{ 3 console.log(serialized_data); 4 5// Base85デコード 6var decodedBase85 = decode_ascii85(serialized_data); 7console.log(decodedBase85); 8 9var compressed =strToUint8Arr(decodedBase85); 10const result = pako.inflate(compressed); 11 12console.log(result); 13 14return result; 15} 16 17function decode_ascii85(a) { 18 a = String(a); 19 var c, d, e, f, g, h = String, l = "length", w = 255, x = "charCodeAt", y = "slice", z = "replace"; 20 for ("<~" === a[y](0, 2) && "~>" === a[y](-2), a = a[y](2, -2)[z](/\s/g, "")[z]("z", "!!!!!"), 21 c = "uuuuu"[y](a[l] % 5 || 5), a += c, e = [], f = 0, g = a[l]; g > f; f += 5) d = 52200625 * (a[x](f) - 33) + 614125 * (a[x](f + 1) - 33) + 7225 * (a[x](f + 2) - 33) + 85 * (a[x](f + 3) - 33) + (a[x](f + 4) - 33), 22 e.push(w & d >> 24, w & d >> 16, w & d >> 8, w & d); 23 24 // 配列を文字列に変換 25 var result = ""; 26 for (var i = 0; i < e.length; i++) { 27 result += String.fromCharCode(e[i]); 28 } 29 30 return result; 31} 32 33function strToUint8Arr(str) { 34 var str = btoa(unescape(encodeURIComponent(str))), 35 charList = str.split(''), uintArray = []; 36 for (var i = 0; i < charList.length; i++) { 37 uintArray.push(charList[i].charCodeAt(0)); 38 } 39 return new Uint8Array(uintArray); 40} 41
追記です
pythonでなら以下のコードで解凍できることを確認しています
pythonの解凍プログラム
1def unzip_str(text: str) -> str: 2 b = base64.b85decode(text) 3 return zlib.decompress(b).decode()
decode_ascii85 で文字列にせずに、直接 Uint8Array にした方が良いのでは…。
やってみましたが、状況変わらずです。
teratail という文字列を python の zip_str にかけると、c$_OqElMm&%*+7*4=n>% になります。
ちなみに、print(list(b)) すると [120, 156, 43, 73, 45, 74, 44, 73, 204, 204, 1, 0, 15, 45, 3, 87] です。
ところが、c$_OqElMm&%*+7*4=n>% を js の decode_ascii85 に渡して e の内容を表示すると
[
194, 160, 15, 131, 139,
175, 139, 66, 31, 236,
91, 180, 242, 176, 109,
237
]
となり、まったく違うバイト列になってますね。
python 側で b85encode ではなく a85encode を使えば、JavaScript でも ascii85 などのライブラリでいけそうですが…。

回答1件
あなたの回答
tips
プレビュー