質問をすることでしか得られない、回答やアドバイスがある。

15分調べてもわからないことは、質問しよう!

新規登録して質問してみよう
ただいま回答率
85.30%
JavaScript

JavaScriptは、プログラミング言語のひとつです。ネットスケープコミュニケーションズで開発されました。 開発当初はLiveScriptと呼ばれていましたが、業務提携していたサン・マイクロシステムズが開発したJavaが脚光を浴びていたことから、JavaScriptと改名されました。 動きのあるWebページを作ることを目的に開発されたもので、主要なWebブラウザのほとんどに搭載されています。

Q&A

解決済

1回答

379閲覧

Zlib圧縮された文字列をjavascriptで解凍する方法を教えてください

tamina0624

総合スコア17

JavaScript

JavaScriptは、プログラミング言語のひとつです。ネットスケープコミュニケーションズで開発されました。 開発当初はLiveScriptと呼ばれていましたが、業務提携していたサン・マイクロシステムズが開発したJavaが脚光を浴びていたことから、JavaScriptと改名されました。 動きのあるWebページを作ることを目的に開発されたもので、主要なWebブラウザのほとんどに搭載されています。

0グッド

0クリップ

投稿2023/09/18 02:11

編集2023/09/18 06:32

実現したいこと

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()

気になる質問をクリップする

クリップした質問は、後からいつでもMYページで確認できます。

またクリップした質問に回答があった際、通知やメールを受け取ることができます。

バッドをするには、ログインかつ

こちらの条件を満たす必要があります。

hoshi-takanori

2023/09/18 02:47

decode_ascii85 で文字列にせずに、直接 Uint8Array にした方が良いのでは…。
tamina0624

2023/09/18 04:00

やってみましたが、状況変わらずです。
hoshi-takanori

2023/09/18 21:45

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 などのライブラリでいけそうですが…。
guest

回答1

0

自己解決

python側の圧縮方法を以下に変更

python

1def zip_str(text: str) -> str: 2 original_bytes = text.encode("utf-8") 3 compressed_data = zlib.compress(original_bytes) 4 compressed_bytes = compressed_data 5 compressed_hex = compressed_bytes.hex() 6 7 return compressed_hex

javascript側で以下のコードで解凍

javascript

1function deserialize(serialized_data) 2{ 3 4const compressedBytes = hexToBytes(serialized_data); 5const result = pako.inflate(compressedBytes); 6 7const decoder = new TextDecoder("utf-8"); 8const decompressedString = decoder.decode(result); 9 10return decompressedString; 11 12}

上記の方法で解決できました

投稿2023/11/14 06:15

tamina0624

総合スコア17

バッドをするには、ログインかつ

こちらの条件を満たす必要があります。

あなたの回答

tips

太字

斜体

打ち消し線

見出し

引用テキストの挿入

コードの挿入

リンクの挿入

リストの挿入

番号リストの挿入

表の挿入

水平線の挿入

プレビュー

15分調べてもわからないことは
teratailで質問しよう!

ただいまの回答率
85.30%

質問をまとめることで
思考を整理して素早く解決

テンプレート機能で
簡単に質問をまとめる

質問する

関連した質問