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

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

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

Javaは、1995年にサン・マイクロシステムズが開発したプログラミング言語です。表記法はC言語に似ていますが、既存のプログラミング言語の短所を踏まえていちから設計されており、最初からオブジェクト指向性を備えてデザインされています。セキュリティ面が強力であることや、ネットワーク環境での利用に向いていることが特徴です。Javaで作られたソフトウェアは基本的にいかなるプラットフォームでも作動します。

PHP

PHPは、Webサイト構築に特化して開発されたプログラミング言語です。大きな特徴のひとつは、HTMLに直接プログラムを埋め込むことができるという点です。PHPを用いることで、HTMLを動的コンテンツとして出力できます。HTMLがそのままブラウザに表示されるのに対し、PHPプログラムはサーバ側で実行された結果がブラウザに表示されるため、PHPスクリプトは「サーバサイドスクリプト」と呼ばれています。

Q&A

解決済

1回答

1247閲覧

PHPのgzcompressをjavaでinflateしたい

aust

総合スコア5

Java

Javaは、1995年にサン・マイクロシステムズが開発したプログラミング言語です。表記法はC言語に似ていますが、既存のプログラミング言語の短所を踏まえていちから設計されており、最初からオブジェクト指向性を備えてデザインされています。セキュリティ面が強力であることや、ネットワーク環境での利用に向いていることが特徴です。Javaで作られたソフトウェアは基本的にいかなるプラットフォームでも作動します。

PHP

PHPは、Webサイト構築に特化して開発されたプログラミング言語です。大きな特徴のひとつは、HTMLに直接プログラムを埋め込むことができるという点です。PHPを用いることで、HTMLを動的コンテンツとして出力できます。HTMLがそのままブラウザに表示されるのに対し、PHPプログラムはサーバ側で実行された結果がブラウザに表示されるため、PHPスクリプトは「サーバサイドスクリプト」と呼ばれています。

0グッド

0クリップ

投稿2020/02/01 16:55

前提・実現したいこと

PHPでgzcompress圧縮されたテキストをjavaのinflaterを使って解凍したいです。
しかし、以下のソースコードでは解凍が上手くいきず空白のまま返ってきます。

余計な変換を避けるためPHPからjavaで圧縮されたデータを受け取る場合、UTF-8でない方が良いでしょうか?(ISO-8859-1型式あるいはバイナリデータのまま受け取る方がいいのか)

当方初心者ゆえ原因、対策もわからずアドバイス頂ければ幸いです。

該当のソースコード

try {
String zippedString = PHPString; //PHPから取得した圧縮テキスト
byte[] output = zippedString.getBytes("UTF-8");
int compressDataLength = zippedString.getBytes("UTF-8").length;

// Decompress the bytes Inflater decompresser = new Inflater(); decompresser.setInput(output, 0, compressedDataLength); byte[] result = new byte[100]; int resultLength = decompresser.inflate(result); decompresser.end(); // Decode the bytes into a String String outputString = new String(result, 0, resultLength, "UTF-8");

} catch(java.io.UnsupportedEncodingException ex) {
// handle
} catch (java.util.zip.DataFormatException ex) {
// handle
}

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

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

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

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

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

guest

回答1

0

ベストアンサー

gz圧縮されたデータであれば java.util.zip.GZIPInputStream を利用
文字列化してしまっているのであれば追加で java.io.ByteArrayInputStream を利用

基本として学んでるはずの FileInputStream / System.in を上記にいれかえるだけなのでコードは割愛

投稿2020/02/02 01:59

退会済みユーザー

退会済みユーザー

総合スコア0

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

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

aust

2020/02/03 07:53

以下のように変更しましたがやはり上手くいきません。 具体的にどのように修正すれば良いですか? private void post_unzipped() { MediaType JSON = MediaType.parse("application/json; charset=utf-8"); OkHttpClient client = new OkHttpClient(); RequestBody formBody = new FormBody.Builder() .add(postname, postdata_zipped.toString()) .build(); Request request = new Request.Builder() .url("PHPのアドレス") .post(formBody) .build(); client.newCall(request).enqueue(new Callback() { @Override public void onFailure(Call call, IOException e) { e.printStackTrace(); } @Override public void onResponse(Call call, Response response) throws IOException { res_zipped = response.body().toString(); String unzipped = null; try { byte[] zbytes = res_zipped.getBytes("UTF-8"); byte[] input = new byte[zbytes.length + 1]; System.arraycopy(zbytes, 0, input, 0, zbytes.length); input[zbytes.length] = 0; ByteArrayInputStream bin = new ByteArrayInputStream(input); GZIPInputStream in = new GZIPInputStream(bin); ByteArrayOutputStream bout = new ByteArrayOutputStream(100); int b; while ((b = in.read()) != -1) { bout.write(b); } bout.close(); unzipped = bout.toString("UTF-8"); } catch (Exception e) { Log.v("unzipped", "error" ); } } }); }
退会済みユーザー

退会済みユーザー

2020/02/03 10:48

これで返ってくる型はなんでしょう? response.body() おそらく、これをtoStringしてるから余計な文字が入ってます
aust

2020/02/06 08:54

ご指摘の通り、response.body()をtoStringでテキスト化⇒getBytesでバイト配列を得る際、 �のような文字がマルチバイト化して圧縮データが崩れているようです。 PHPから直接バイト配列を返してもらうか、エンコードを工夫してみます。
aust

2020/02/06 12:59

ありがとうございます。 無事、圧縮データを展開することが出来ました。 gz圧縮されたバイト配列に負の値が入っているとは知らずテキスト化していたのが そもそもの間違いでした。自分の書いたコードの中身を勉強するようにします。 何度もご回答いただき、ありがとうございました。
guest

あなたの回答

tips

太字

斜体

打ち消し線

見出し

引用テキストの挿入

コードの挿入

リンクの挿入

リストの挿入

番号リストの挿入

表の挿入

水平線の挿入

プレビュー

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

ただいまの回答率
85.48%

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

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

質問する

関連した質問