C# と VB.NET の質問掲示板

ASP.NET、C++/CLI、Java 何でもどうぞ

C# と VB.NET の入門サイト

【C#】XZでmemory streamで圧縮・解凍したい

[トピック内 14 記事 (1 - 14 表示)]  << 0 >>

■100613 / inTopicNo.1)  【C#】XZでmemory streamで圧縮・解凍したい
  
□投稿者/ aiko (1回)-(2022/09/30(Fri) 11:47:38)

分類:[C#] 

C#でXZで圧縮・解凍をするサンプルを作っています。
圧縮対象テキストボックスにstringを入力→圧縮ボタンで圧縮対象テキストボックスの内容を圧縮実行→圧縮結果をテキストボックスへ表示→解凍ボタンで圧縮結果のテキストボックスの内容を解凍→解凍結果を解凍結果テキストボックスへ表示
このようなものを作ろうと思っています。

XZでfilestreamを使ってファイルを圧縮、解凍するというサンプルはできたのですが、memorystreamに変えるところがうまくいかない状況です。

ネットで調べていますがfilestreamのサンプルが多く、memorystreamで圧縮・解凍しているサンプルを見つけられません。
ヒントや助言をいただけるませんでしょうか。
よろしくお願いいたします。
引用返信 編集キー/
■100615 / inTopicNo.2)  Re[1]: 【C#】XZでmemory streamで圧縮・解凍したい
□投稿者/ 魔界の仮面弁士 (3459回)-(2022/09/30(Fri) 12:46:28)
No100613 (aiko さん) に返信
> 圧縮対象テキストボックスにstringを入力
System.Text.Encoding.Unicode.GetBytes あるいは
System.Text.Encoding.UTF8.GetBytes メソッドを使えば、
string を byte[] に変換できます。

byte[] はそのまま XZ.NET.InputStream に渡せますし、
BinaryStream にしたいなら、var stm = new System.IO.BinaryStream(バイト配列); で OK。

BinaryStream の中身を byte[] に復元したいのであれば、.ToArray() メソッドで。


> 圧縮結果をテキストボックスへ表示
圧縮後のバイナリは可読文字列のデータでは無いので、文字列として表現するのは無理かと。

バイナリデータを文字列化するために、BASE64 とか、HexString にして表示する事ならばできますが、
その場合、元の文字列よりもむしろ長くなってしまうんじゃないかな…?
引用返信 編集キー/
■100617 / inTopicNo.3)  Re[2]: 【C#】XZでmemory streamで圧縮・解凍したい
□投稿者/ aiko (2回)-(2022/09/30(Fri) 13:43:59)
No100615 (魔界の仮面弁士 さん) に返信
> ■No100613 (aiko さん) に返信

> byte[] はそのまま XZ.NET.InputStream に渡せますし、
> BinaryStream にしたいなら、var stm = new System.IO.BinaryStream(バイト配列); で OK。
>

すみません、この部分が自分でよくわかっていなくて、元々ファイルを読んで圧縮して解凍する方を作った時に参考にしたのが
https://qiita.com/koshian2/items/27fb38cd97386aec7a83
↑こちらのサイトなのですが、ここでFileStreamを使っているのをMemoryStreamに変えるイメージでしょうか?


>>圧縮結果をテキストボックスへ表示
> 圧縮後のバイナリは可読文字列のデータでは無いので、文字列として表現するのは無理かと。
>
> バイナリデータを文字列化するために、BASE64 とか、HexString にして表示する事ならばできますが、
> その場合、元の文字列よりもむしろ長くなってしまうんじゃないかな…?

文字列表示ではなく、1文字ずつバイナリ配列に入れて圧縮前と圧縮後で整合性が取れるかを確認したいという感じです。
引用返信 編集キー/
■100619 / inTopicNo.4)  Re[3]: 【C#】XZでmemory streamで圧縮・解凍したい
□投稿者/ radian (98回)-(2022/09/30(Fri) 14:45:54)
2022/09/30(Fri) 14:46:33 編集(投稿者)

No100617 (aiko さん) に返信
> すみません、この部分が自分でよくわかっていなくて、元々ファイルを読んで圧縮して解凍する方を作った時に参考にしたのが
> https://qiita.com/koshian2/items/27fb38cd97386aec7a83
> ↑こちらのサイトなのですが、ここでFileStreamを使っているのをMemoryStreamに変えるイメージでしょうか?

とりあえず実際にMemoryStreamに変えて試してみてはどうでしょう?(すぐ試せますよね?)
試した結果エラー等が発生したなら、ソース記載して
どこでどういうエラーが発生したか書けばアドバイス貰えると思います。

引用返信 編集キー/
■100643 / inTopicNo.5)  Re[4]: 【C#】XZでmemory streamで圧縮・解凍したい
□投稿者/ aiko (3回)-(2022/10/04(Tue) 15:12:05)
> とりあえず実際にMemoryStreamに変えて試してみてはどうでしょう?(すぐ試せますよね?)
> 試した結果エラー等が発生したなら、ソース記載して
> どこでどういうエラーが発生したか書けばアドバイス貰えると思います。
>

アドバイスありがとうございます。
MemoryStreamに変えてやってみようと色々試しましたが、根本を理解していないのか先に進めずにいます。

byte[] はそのまま XZ.NET.InputStream に渡せるとのアドバイスを頂いたので、
var xzStream = new XZInputStream([stringをバイト配列に変換したもの])としましたがうまくいきません。



引用返信 編集キー/
■100644 / inTopicNo.6)  Re[5]: 【C#】XZでmemory streamで圧縮・解凍したい
□投稿者/ 魔界の仮面弁士 (3461回)-(2022/10/04(Tue) 15:46:54)
No100643 (aiko さん) に返信
> byte[] はそのまま XZ.NET.InputStream に渡せるとのアドバイスを頂いたので、
ソースコードを見た限りは、そういう実装がありますね。
https://github.com/RomanBelkov/XZ.NET/blob/master/XZ.NET/XZInputStream.cs#L53


> var xzStream = new XZInputStream([stringをバイト配列に変換したもの])としましたがうまくいきません。
掲示板を見ている第三者に対して、うまくいきませんという一言だけで、現状の問題を推察させるのは、あまりに酷というものでしょう。

上記の一文だけ見れば、文法的に「末尾セミコロンが抜けているから」と答えることができますが……そういう話ではありませんよね?

引数の中身が具体的にどうなっていて、どういう結果を期待したのでしょうか?

コンパイルエラーになるなら、そのエラー内容を正確に書き写します。
実行時に例外となるのなら、例外の内容を記載します。
エラーにはならないが期待動作しないのなら、どうなって欲しいのに、実際にはどうなったのかを示しましょう。


---

『stringをバイト配列に変換』する部分をどのように実装したのかも分かりませんが、
まずは問題となっている、指定した引数について教えてください。

変換前の string と、変換後のバイト配列の内容を明示することはできますか?
(あまり長すぎない検証用のデータにしてください)
引用返信 編集キー/
■100645 / inTopicNo.7)  Re[6]: 【C#】XZでmemory streamで圧縮・解凍したい
□投稿者/ aiko (4回)-(2022/10/04(Tue) 16:01:12)
No100644 (魔界の仮面弁士 さん) に返信

> 引数の中身が具体的にどうなっていて、どういう結果を期待したのでしょうか?
> 『stringをバイト配列に変換』する部分をどのように実装したのかも分かりませんが、
> まずは問題となっている、指定した引数について教えてください。
> 変換前の string と、変換後のバイト配列の内容を明示することはできますか?
> (あまり長すぎない検証用のデータにしてください)


 byte[] bytesData;
bytesData = System.Text.Encoding.UTF8.GetBytes("あいうえお");

 としてbytesDataを引数で渡しております。

string[あいうえお]をXZで圧縮したものをバイト型配列で取得したいです。
 

引用返信 編集キー/
■100646 / inTopicNo.8)  Re[7]: 【C#】XZでmemory streamで圧縮・解凍したい
□投稿者/ 魔界の仮面弁士 (3462回)-(2022/10/04(Tue) 19:20:26)
No100645 (aiko さん) に返信
>  byte[] bytesData;
> bytesData = System.Text.Encoding.UTF8.GetBytes("あいうえお");
>  としてbytesDataを引数で渡しております。

それで…肝心の圧縮処理や、バイト配列を取得する処理のコードは何処ですか?


もしかして、デコードとエンコードを逆に設定していないでしょうか。
XZInputStream クラスは、圧縮済みデータを復元する(デコード)するもので
XZOutputStream クラスは、生データを圧縮する(エンコード)ためのものです。

もっとも逆指定ならば、実行時にフォーマットエラーになるのですぐに気づくはず。


> string[あいうえお]をXZで圧縮したものをバイト型配列で取得したいです。
それは質問点や問題点では無く、あくまでも「やりたいこと」ですよね。
現状の投稿ですと、【質問】というよりも、《代理制作依頼》のようになってしまっています。


どう書いて良いのか分からないわけではなく、書いたけれども
>> うまくいかない状況です。
>> うまくいきません。
という事なので、試行錯誤されているということは十分に分かるのですが、
どこまで理解しているかの説明も無ければ、試行錯誤した結果どうなっているのかも
一向に示されないので、問題点を修正することも不明点に対して解説することもできません。


FileStream 版のソースについては、どこまで理解されている状況でしょうか。
たとえばあのサンプルで ArchiveType.Tar が使われていたのは、XZ は圧縮技術であり、
ファイルをアーカイブする機能が含まれていないためですよね。

今回はアーカイブの必要が無いので、ファイル情報は不要で、ファイルの内容
あるいは byte[] を直接圧縮する形にすれば良い事になります。

その上で、XZ.NET に渡すべきデータとしては、
Stream クラスを使う方法(FileStream や MemoryStream でも可)と、
byte[] を使う方法があります。

どちらでも書けますが、byte[] の方がお手軽とは思います。

たとえば、静的メソッドを通じて
 byte[] rawData = System.Text.Encoding.UTF8.GetBytes("あいうえお"); // 元データは 15 バイト
 byte[] encData1 = XZ.NET.XZOutputStream.Encode(rawData); // 圧縮後は 72 バイト
と書くことができます。


一方、MemoryStream を渡す場合はこんな感じです。
入力されたデータを少しずつ追記していきたいような場合はこっちでも良いかも。

byte[] encData2 = { };
byte[] rawData = System.Text.Encoding.UTF8.GetBytes("あいうえお");
using (var mem = new System.IO.MemoryStream())
using (var xzStream = new XZ.NET.XZOutputStream(mem))
{
  xzStream.Write(rawData, 0, rawData.Length);
  xzStream.Close();
  encData2 = mem.ToArray();
}


なお、上記 2 つの方法で作られた encData1 と encData2 の内容が同じになるとは限りません。
引用返信 編集キー/
■100647 / inTopicNo.9)  Re[8]: 【C#】XZでmemory streamで圧縮・解凍したい
□投稿者/ kiku (295回)-(2022/10/05(Wed) 09:09:52)
No100646 (魔界の仮面弁士 さん) に返信
> ■No100645 (aiko さん) に返信

> たとえば、静的メソッドを通じて
>  byte[] rawData = System.Text.Encoding.UTF8.GetBytes("あいうえお"); // 元データは 15 バイト
>  byte[] encData1 = XZ.NET.XZOutputStream.Encode(rawData); // 圧縮後は 72 バイト
> と書くことができます。

> 一方、MemoryStream を渡す場合はこんな感じです。
> 入力されたデータを少しずつ追記していきたいような場合はこっちでも良いかも。
>
> byte[] encData2 = { };
> byte[] rawData = System.Text.Encoding.UTF8.GetBytes("あいうえお");
> using (var mem = new System.IO.MemoryStream())
> using (var xzStream = new XZ.NET.XZOutputStream(mem))
> {
>   xzStream.Write(rawData, 0, rawData.Length);
>   xzStream.Close();
>   encData2 = mem.ToArray();
> }

上記、2つとも動作することを確認しました。
もしかするとですが、下記操作をしていないことによってエラーが発生しているかもと思い、記述します。

1.nugetからXZ.NETをインストールする
2.ソリューションエクスプローラ上に
  「liblzma.dll」が表示されているので
  そのプロパティの「出力ディレクトリにコピー」の項目を
  「常にコピー」に変更する。

上記2を行わないとDLLがないエラーになります。
引用返信 編集キー/
■100649 / inTopicNo.10)  Re[9]: 【C#】XZでmemory streamで圧縮・解凍したい
□投稿者/ 魔界の仮面弁士 (3463回)-(2022/10/05(Wed) 11:18:42)
No100647 (kiku さん) に追加補足
> もしかするとですが、下記操作をしていないことによってエラーが発生しているかもと思い、記述します。
> 上記2を行わないとDLLがないエラーになります。

しかし環境側の問題だとすると No100613
>> filestreamを使ってファイルを圧縮、解凍するというサンプルはできたのですが、
が成功した理由を説明できないのですよね…。


> 1.nugetからXZ.NETをインストールする
32bit 版と 64bit 版が別パッケージになっているので注意が必要です。
https://www.nuget.org/packages/XZ.NET
https://www.nuget.org/packages/XZ.NET-x64

単一パッケージで AnyCPU 対応にして欲しいという要望は出ていたのですけれどね。
https://github.com/RomanBelkov/XZ.NET/issues/7#issuecomment-461109163

なお、上記パッケージの利用はお奨めしません(理由は後述)。


> 2.ソリューションエクスプローラ上に
「ソリューション エクスプローラー」が正式名称ですね。細かい差ではありますが、
「ソリューション エクスプローラ」は VS2008 までの古い名称です。
https://atmarkit.itmedia.co.jp/news/200807/25/microsoft.html


>   「liblzma.dll」が表示されているので
それは XZ.NET を nuget する際に
PackageReference ではなく、
Packages.config を選択した場合の状況だと思います。

PackageReference の場合はソリューションエクスプローラーに表示されないので
%userprofile%\.nuget\packages\xz.net\2.0.0\content\
から拾う必要があったりします。


>   「liblzma.dll」が表示されているので
XZ.NET パッケージ (x86 ビルド)では liblzma.dll が必要ですが、
XZ.NET-x64 パッケージ (x64 ビルド)では liblzma64.dll が必要です。


>   そのプロパティの「出力ディレクトリにコピー」の項目を
>   「常にコピー」に変更する。
XZ.NET や XZ.NET-x64 ではなく、現在は XZ.NET-netstandard の nuget パッケージをお奨めします。
https://www.nuget.org/packages/XZ.NET-netstandard/

このパッケージを使えば、出力ディレクトリにコピーする設定操作が不要になります。
PackageReference でも Packages.config でも構いません。
(XZ.NET.dll , liblzma64.dll , liblzma.dll ファイルが自動的に配置される)

AnyCPU / x64 / x86 いずれでも使えますし、.NET Framework でも .NET 6 / .NET Core でも OK です。
引用返信 編集キー/
■100651 / inTopicNo.11)  Re[10]: 【C#】XZでmemory streamで圧縮・解凍したい
□投稿者/ kiku (296回)-(2022/10/05(Wed) 16:47:41)
No100649 (魔界の仮面弁士 さん) に返信
> ■No100647 (kiku さん) に追加補足
> XZ.NET や XZ.NET-x64 ではなく、現在は XZ.NET-netstandard の nuget パッケージをお奨めします。
> https://www.nuget.org/packages/XZ.NET-netstandard/
>
> このパッケージを使えば、出力ディレクトリにコピーする設定操作が不要になります。
> PackageReference でも Packages.config でも構いません。
> (XZ.NET.dll , liblzma64.dll , liblzma.dll ファイルが自動的に配置される)
>
> AnyCPU / x64 / x86 いずれでも使えますし、.NET Framework でも .NET 6 / .NET Core でも OK です。

うわ、詳細返信があり、びっくり。
なるほど、確かにXZ.NET-netstandardを使った方が良いですね。
こちらを使うようにしてください。 ===> aikoさん
引用返信 編集キー/
■100654 / inTopicNo.12)  Re[11]: 【C#】XZでmemory streamで圧縮・解凍したい
□投稿者/ aiko (5回)-(2022/10/06(Thu) 12:05:58)
No100651 (kiku さん) に返信
> ■No100649 (魔界の仮面弁士 さん) に返信
>>■No100647 (kiku さん) に追加補足
>>XZ.NET や XZ.NET-x64 ではなく、現在は XZ.NET-netstandard の nuget パッケージをお奨めします。
>>https://www.nuget.org/packages/XZ.NET-netstandard/
>>
>>このパッケージを使えば、出力ディレクトリにコピーする設定操作が不要になります。
>>PackageReference でも Packages.config でも構いません。
>>(XZ.NET.dll , liblzma64.dll , liblzma.dll ファイルが自動的に配置される)
>>
>>AnyCPU / x64 / x86 いずれでも使えますし、.NET Framework でも .NET 6 / .NET Core でも OK です。
>
> うわ、詳細返信があり、びっくり。
> なるほど、確かにXZ.NET-netstandardを使った方が良いですね。
> こちらを使うようにしてください。 ===> aikoさん

魔界の仮面弁士さん、kiku さん、ご返信いただきありがとうございます。
XZ.NET-netstandardというnugetパッケージがあるのですね。
私はnugetからXZ.NETをインストールし、XZ Utilsからxz-5.2.3-windows.zipをダウンロードして、その中にあるliblzma.dllフォルダへコピーしていました。

XZ.NET-netstandardをインストールしたところ、それだけでXZが使えるようになりました。

私自身、ツールの検索すると最新でない方法がヒットしたり、調べても欲しい情報がなかったりすることが多いのですが、今回のようにXZ.NETではなくXZ.NET-netstandardがよいなどそういう情報は皆さんどのようにして探し当てているのでしょうか。
私自身開発経験が浅いので知らないことも多く、少しずつキャッチアップしていこうとおもっているのですがわからないことの連続で頭が回らない状態です。
ここでの質問も何がわからないのかわからない状態で大変失礼な質問をしてしまい申し訳ありませんでした。

引用返信 編集キー/
■100655 / inTopicNo.13)  Re[12]: 【C#】XZでmemory streamで圧縮・解凍したい
□投稿者/ 魔界の仮面弁士 (3464回)-(2022/10/06(Thu) 20:41:21)
2022/10/06(Thu) 20:52:00 編集(投稿者)

No100654 (aiko さん) に返信
> 私自身、ツールの検索すると最新でない方法がヒットしたり、調べても欲しい情報がなかったりすることが多いのですが、

# 最初から「XZ.NET のライブラリを使っている」ことと、その呼び出し方を調べているのだと
# 書いてもらえれば、もっと早くサンプルを提示できたのですけれどね…。(^^;


> 今回のようにXZ.NETではなくXZ.NET-netstandardがよいなどそういう情報は皆さんどのようにして探し当てているのでしょうか。

今回の回答は、すべて私自身も知らなかったことなので、
以下、調査工程について雑談的につらつらと書いてみます。

無駄に長文なので、興味が無い人は読み飛ばし推奨。

----------------------

最初に No100613 (2022/09/30 11:47:38) の質問を読んだ段階では、
私は XZ というものが何であるかすら、まっっったく知りませんでした。


質問文を読めば、圧縮アルゴリズムかライブラリであろうとは推察できますし、wikipedia でも
「xz は、データ圧縮プログラムのひとつ、およびその圧縮データのフォーマットである。」
と説明されている程度のことまでは調べられますが、分かるのはそこまでです。

C# から呼べそうな XZ 用のライブラリは、SharpCompress や ManagedXZ や XZ.NET などなど
多数見つかるものの、元質問からは何を使っているのか読み解けないので、回答のしようがありません。

しかし、filestream (おそらくは FileStream のこと) や memorystream (恐らく MemoryStream のこと) の話が
出ていることから、今使っているライブラリは、System.IO.Stream で受け渡されるライブラリを
使っているのだという事は容易に推察できました。

また、質問内容は『分からない』ではなく『うまくいかない』とのことだったので、情報不足ではあるものの
「いいところまで行ってそうだけど、期待動作しないので助けて欲しい」という状況だと推察し、
何かとっかかりがあれば自己解決できる問題なのだろうと想像しました。


実はこの時点では、手元に開発環境が無く、Visual Studio を立ち上げて試すこともできなかった状況です。
しかし、Google 検索したところでは XZ.NET という物を偶然見つけ、もしかしてこれかな…? と予想を立てました。

https://github.com/RomanBelkov/XZ.NET
上記のソースをブラウザで眺めてみると、XZOutputStream.cs や XZInputStream.cs のコンストラクタでは
引数として FileStream ではなく Stream を受け付けていることがわかります。開発環境が無くて試せなかったのと
使い方も分からないうえ、 aiko さんが XZ.NET を使っているかどうかさえ分かないという手探りな状況です。

あまり具体的な回答ができる状況では無かったのですが、ひとまず、BinaryStream 操作のために
byte[] を扱う点に絞って回答をつけました。 No100615 (2022/09/30 12:46:28) がソレです。

何のためにテキストボックスを使っているのかも、いまいち分からなかったという事情もありますし、
暫定的に XZ.NET の名を挙げておけば、それ以外のライブラリを使っていた場合に、
何かしら追加の情報を返答してくれるだろうとの期待もありました。


幸いなことに、次の No100617 (2022/09/30 13:43:59) で紹介された URL で、XZ.NET を使っていることが判明しました。
(元から使っていたのか、私の投稿を見てのことだったのかは分かりませんけれどね)

いずれせよ、 URL のサンプルソースを見れば、圧縮させたい生データを XZOutputStream に対して
Write メソッドで書きつけていくだけで良いのだと、この段階で知りました。InputStream なら圧縮データの復元でしょう。

開発環境が無くて試せないため、圧縮後にどのような結果が得られるのかも想像できていませんでしたが、
クラス側は FileStream を要求しているわけではなく、基底たる Stream を求めているのですから、
FileStream で呼び出せたものが MemoryStream で処理出来ない道理はありません。

となれば、「tar でアーカイブした FileStream」の部分を「任意の BinaryStream」に変えるだけで良いはずであり、
aiko さんが何に悩んでいるかは、この時点でも汲み取れませんでした。
(この時点では、byte[] 経由で利用する方法については、一切把握していない状態です)


こちらも具体的なサンプルを出せる状況では無かったのですが、元質問を読み返しても、
aiko さんがどのようなコードを書いたのかを推察することさえできないため、
もっと具体的な情報がもらえないかと促す意味も含めて、 No100644 (2022/10/04 15:46:54) の回答を付けました。

たとえ間違っているコードであっても、実際に手を動かした人のコードを見せてもらえれば、
私以外の他の回答者も、何に困っているのかを理解しやすいだろうという思惑もありました。


しかし No100645 (2022/10/04 16:01:12) の返答を見た時には、肝心の圧縮処理が何も書かれていないので、
どうやら FileStream とか MemoryStream といった違い以前の問題で詰まっているらしいと推察しました。

そうなると、これはこちらも実際に試さないと先に進まなそうだな…と思いなおしたものの、
残念ながら、そもそもの aiko さんの環境が分かりません。.NET 6 なのか .NET Framework なのさえ不明です。

夜になって、当方もひとまず開発できる環境に戻ってきたので、仮に .NET Framework 4.8.1 な
コンソールアプリのプロジェクトを用意して、早速 nuget しようとしました。

ところが、XZ.NET の名を冠するパッケージが複数あり、どれを使うべきなのか判断できません。
まずは最初にヒットした "XZ.NET" がダウンロード数も多いので最初に試すことにしました。

幸い、XZOutputStream と XZIntputStream の 2 クラスしかない単純なライブラリでしたので、
提示頂いたサンプルも見ながら、さほど悩まずにコーディングできました。
静的メソッドを見つけたのもこの時です。

ところがそのまま実行してみると、アーキテクチャが AnyCPU (MSIL) のものでは無いとアラートが出たため、
ビルド設定を x86 に変更。すると今度は DllNotFoundException の実行時エラーになりました。

参照モードを PackageReference から Packages.config に切り替えてみましたが、それでも状況は改善しなかったので、
おそらくは出力先フォルダーに、追加の DLL を配置する必要があるのだと考えました。
XZ.NET について検索した時点で、32bit/64bit 版とで異なる DLL を呼び出しているという事を、
先の Issues #7 の書き込みから推察していたためです。
https://github.com/RomanBelkov/XZ.NET/issues/7#issuecomment-461109163

案の定、これらの作業によって無事に変換できることは分かったのですが、試してみると
静的メソッド(XZOutputStream.Encode) を使った場合と、
インスタンスメソッド(XZOutputStream.Write) の場合とで、異なるバイナリになることが分かりました。

とはいえ、どちらのバイナリからも元データを復元できたので、手順的にはおそらく間違ってはいないのだろうと考え、
先の No100646 (2022/10/04 19:20:26) として、ようやく具体的な回答として投稿しました。

ありがたいことに、さらにその内容について、kiku さんの No100647 にて補足頂きました。

そして kiku さんの捕捉が投稿された頃、自分は「XZ.NET の名を冠した他のパッケージ」として、
"XZ.NET" と同じ作者(RomanBelkov 氏)の "XZ.NET-x64" と "XZ.NET-netstandard" を調査中でした。

試してみると、.NET Standard 版の方は build\XZ.NET-netstandard.targets が準備されており、
「出力ディレクトリにコピー」の処理が自動的に行われるようになっており、試してみると 32bit/64bit 両対応でした。

.NET Core にも対応したクロスプラットフォームですし(と言っても、Xamarin.Android では使えないらしい?)、
公開日も "XZ.NET" や "XZ.NET-x64" より新しいものなので、現状はこちらを使うべきだと判断しました。

その点を追記した物が、 No100649 の補足投稿となります。
引用返信 編集キー/
■100660 / inTopicNo.14)  Re[13]: 【C#】XZでmemory streamで圧縮・解凍したい
□投稿者/ kiku (297回)-(2022/10/11(Tue) 12:01:09)
WinFormアプリ、.NETFrameWork4.8で検証したときのソースを貼っておきます。
MemoryStreamを利用するパターンと利用しないパターンと両方検証しています。
また、圧縮1(MemoryStream利用しない)と圧縮2(MemoryStream利用する)で
圧縮後のバイナリが異なるとの書き込みが「魔界の仮面弁士さん」からあったので
本当かなと思い検証も行っています。
結果は確かにバイナリは異なるのですが、解凍を行うと問題なく解凍結果は一致していました。

        private void button1_Click(object sender, EventArgs e)
        {
            var inputdata = "あいうえお";
            var bytesData = System.Text.Encoding.UTF8.GetBytes(inputdata);

            var ret1 = CompressToMemory1(bytesData);
            string str1 = BitConverter.ToString(ret1);
            Console.WriteLine(str1);

            var ret2 = CompressToMemory2(bytesData);
            string str2 = BitConverter.ToString(ret2);
            Console.WriteLine(str2);

            if(str1 == str2)
            {
                Console.WriteLine("圧縮方法1と2の比較:一致");
            }
            else
            {
                //同じ文字列をエンコードしているが一致する保証はない
                Console.WriteLine("圧縮方法1と2の比較:不一致");
            }

            var ret3 = DecompressToMemory1(ret1);
            var str3 = System.Text.Encoding.UTF8.GetString(ret3);
            if (str3 == inputdata)
            {
                Console.WriteLine("圧縮方法1、解凍方法1での確認:一致");
            }
            else
            {
                Console.WriteLine("圧縮方法1、解凍方法1での確認:不一致");
            }

            var ret4 = DecompressToMemory1(ret2);
            var str4 = System.Text.Encoding.UTF8.GetString(ret4);
            if (str4 == inputdata)
            {
                Console.WriteLine("圧縮方法2、解凍方法1での確認:一致");
            }
            else
            {
                Console.WriteLine("圧縮方法2、解凍方法1での確認:不一致");
            }

            var ret5 = DecompressToMemory2(ret1);
            var str5 = System.Text.Encoding.UTF8.GetString(ret5);
            if (str5 == inputdata)
            {
                Console.WriteLine("圧縮方法1、解凍方法2での確認:一致");
            }
            else
            {
                Console.WriteLine("圧縮方法1、解凍方法2での確認:不一致");
            }

            var ret6 = DecompressToMemory2(ret2);
            var str6 = System.Text.Encoding.UTF8.GetString(ret6);
            if (str6 == inputdata)
            {
                Console.WriteLine("圧縮方法2、解凍方法2での確認:一致");
            }
            else
            {
                Console.WriteLine("圧縮方法2、解凍方法2での確認:不一致");
            }

        }

        private byte[] CompressToMemory1(byte[] bytesData)
        {
            var ret = XZ.NET.XZOutputStream.Encode(bytesData);
            return ret;
        }

        private byte[] CompressToMemory2(byte[] bytesData)
        {
            byte[] ret;
            using (var ms = new MemoryStream())
            using (var xzStream = new XZOutputStream(ms))
            {
                xzStream.Write(bytesData, 0, bytesData.Length);
                xzStream.Close();
                ret = ms.ToArray();
            }
            return ret;
        }

        private byte[] DecompressToMemory1(byte[] bytesData)
        {
            var ret = XZ.NET.XZInputStream.Decode(bytesData);
            return ret;
        }

        private byte[] DecompressToMemory2(byte[] bytesData)
        {
            byte[] ret;
            using (var msInput = new MemoryStream())
            {
                msInput.Write(bytesData, 0, bytesData.Length);
                msInput.Position = 0;
                using (var xzStream = new XZInputStream(msInput))
                using (var msResult = new MemoryStream())
                {
                    xzStream.CopyTo(msResult);
                    msResult.Close();
                    ret = msResult.ToArray();
                }
            }
            return ret;
        }

引用返信 編集キー/

このトピックをツリーで一括表示


トピック内ページ移動 / << 0 >>

このトピックに書きこむ