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

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

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

FileStreamを使わない圧縮、解凍について教えて下さい

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

■99970 / inTopicNo.1)  FileStreamを使わない圧縮、解凍について教えて下さい
  
□投稿者/ さや (1回)-(2022/06/27(Mon) 15:08:10)

分類:[C#] 

C#でFileStreamを使ってファイルを読み込み、stream.Readでbufferの値など使って圧縮・解凍を行うサンプルプログラムがあります。
それを利用して、ファイルではなくファイルの内容をパラメータで受け取り圧縮・解凍するプログラムを作っております。
・テキストファイルであればファイル名ではなくファイル内の「ああああ」という文字をパラメータで受け取る
・もしくはASCIIコードで受け取る?
サンプルがStreamを使っているのでそれをできるだけ活かしたいのですが、どのように作ればいいのかわからず行き詰っております。
今までフォーム表示する業務系のプログラムを作っていたので、符号化、復号化についてもわかっていない状態です。
大変わかりにくい文章で恐縮ですが、アドバイスいただけると助かります。
引用返信 編集キー/
■99971 / inTopicNo.2)  Re[1]: FileStreamを使わない圧縮、解凍について教えて下さい
□投稿者/ Hongliang (1242回)-(2022/06/27(Mon) 15:19:56)
System.IO.MemoryStreamクラスを使えばメモリ上のデータをStreamとして扱えるようになります。
文字列は文字の集まりで、Streamはbyteの集まりなので、変換する必要がありますが、これにはSystem.Text.Encodingクラスを使用できます。
byte[] bytes = Encoding.UTF8.GetBytes(text);
Stream sourceStream = new MemoryStream(bytes);
引用返信 編集キー/
■99972 / inTopicNo.3)  Re[1]: FileStreamを使わない圧縮、解凍について教えて下さい
□投稿者/ furu (161回)-(2022/06/27(Mon) 15:26:17)
No99970 (さや さん) に返信
> C#でFileStreamを使ってファイルを読み込み、stream.Readでbufferの値など使って圧縮・解凍を行うサンプルプログラムがあります。
> それを利用して、ファイルではなくファイルの内容をパラメータで受け取り圧縮・解凍するプログラムを作っております。
> ・テキストファイルであればファイル名ではなくファイル内の「ああああ」という文字をパラメータで受け取る
> ・もしくはASCIIコードで受け取る?
FileStreamの代わりにMemoryStreamを使用します。

using (var ms = new MemoryStream())
{
    var buff = Encoding.UTF8.GetBytes("ああああ");
    ms.Write(buff, 0,  buff.Length);

    圧縮(ms);
}

引用返信 編集キー/
■99973 / inTopicNo.4)  Re[2]: FileStreamを使わない圧縮、解凍について教えて下さい
□投稿者/ さや (3回)-(2022/06/27(Mon) 15:49:58)
Hongliangさん、furu さん

質問へご回答いただきありがとうございます。
MemoryStreamを使用したら文字列をStreamとして扱えるようになりました。
自分で検索しても探し出せなかったので助かりました。
本当にありがとうございます。

もしまだお付き合いいただけるようでしたらもう1つ質問してもよろしいでしょうか。
テキストだけでなく画像や音声も圧縮したいという希望があるのですが、その場合はバイナリデータで受け取るということになるのでしょうか?
(フォームへファイルをドラッグアンドドロップし圧縮ボタンで圧縮するプログラムで、圧縮、解凍の処理だけをDLL化するように指示されております。)
さらっとバイナリデータと言っていますがバイナリデータもよくわかっていなくて0と1で構成されているということしかわからないような感じです。
度々で申し訳ございませんが、よろしくお願いいたします。
引用返信 編集キー/
■99974 / inTopicNo.5)  Re[3]: FileStreamを使わない圧縮、解凍について教えて下さい
□投稿者/ WebSurfer (2499回)-(2022/06/27(Mon) 15:59:47)
No99973 (さや さん) に返信

> テキストだけでなく画像や音声も圧縮したいという希望があるのですが、

「圧縮」というのは具体的にどうしたいのか不明ですが、複数のファイルを zip ファイルに
纏めるので良ければ以下の記事が参考になると思います。検討してみてはいかがですか?

byte配列に読み込んだファイルの内容をMemoryStream上でzipファイルにする
https://kiyokura.hateblo.jp/entry/2015/03/25/233117
引用返信 編集キー/
■99975 / inTopicNo.6)  Re[4]: FileStreamを使わない圧縮、解凍について教えて下さい
□投稿者/ さや (4回)-(2022/06/27(Mon) 16:05:03)
No99974 (WebSurfer さん) に返信
> ■No99973 (さや さん) に返信
>
>>テキストだけでなく画像や音声も圧縮したいという希望があるのですが、
>
> 「圧縮」というのは具体的にどうしたいのか不明ですが、複数のファイルを zip ファイルに
> 纏めるので良ければ以下の記事が参考になると思います。検討してみてはいかがですか?
>
> byte配列に読み込んだファイルの内容をMemoryStream上でzipファイルにする
> https://kiyokura.hateblo.jp/entry/2015/03/25/233117


ご回答ありがとうございます。
圧縮は7zipのLZMA SDKを使って圧縮するよう指示されております。
https://sevenzip.osdn.jp/sdk.html

この中にあるC#のサンプルがファイルを引数で渡して圧縮しており、その部分をファイル名ではなくバイナリデータなどで渡して圧縮するようなDLLを作成しております。

引用返信 編集キー/
■99976 / inTopicNo.7)  Re[5]: FileStreamを使わない圧縮、解凍について教えて下さい
□投稿者/ 伝説のカレー (22回)-(2022/06/27(Mon) 16:07:42)
No99975 (さや さん) に返信

7zipのAPIにbyte[]を引数に取るメソッドがあるんじゃないかな
それを呼べば良いと思います
引用返信 編集キー/
■99977 / inTopicNo.8)  Re[6]: FileStreamを使わない圧縮、解凍について教えて下さい
□投稿者/ 伝説のカレー (23回)-(2022/06/27(Mon) 16:09:20)
圧縮するデータの入力元がよくわからないですけど
最近だとバイナリをBase64でエンコードしたデータをJSONで受け取るとかありますよねー
引用返信 編集キー/
■99979 / inTopicNo.9)  Re[5]: FileStreamを使わない圧縮、解凍について教えて下さい
□投稿者/ WebSurfer (2501回)-(2022/06/27(Mon) 16:31:13)
No99975 (さや さん) に返信

> この中にあるC#のサンプルがファイルを引数で渡して圧縮しており、その部分をファイル名ではなく
> バイナリデータなどで渡して圧縮するようなDLLを作成しております。

そのサンプルもファイルを読み込んでバイト列を取得しそれを圧縮しているのではないですか?
であれば、ファイルを読み込んでバイト列を取得する部分が不要になるだけではないかと思うのですが。
引用返信 編集キー/
■99980 / inTopicNo.10)  Re[6]: FileStreamを使わない圧縮、解凍について教えて下さい
□投稿者/ さや (5回)-(2022/06/27(Mon) 16:55:03)
No99976 (伝説のカレー さん) に返信
> ■No99975 (さや さん) に返信
>
> 7zipのAPIにbyte[]を引数に取るメソッドがあるんじゃないかな
> それを呼べば良いと思います

ご回答ありがとうございます。
7zipのAPIにあるかもしれないんですね。
7zipもイマイチよくわかっていなくて、7zipの中にLZMAがあるという認識でいいのか???という感じでLZMA SDKなら間違いないだろうと思いそちらをダウンロードしたしだいです。
探しているものにもう少し近いものがないかネットで検索してみたいと思います。
引用返信 編集キー/
■99981 / inTopicNo.11)  Re[6]: FileStreamを使わない圧縮、解凍について教えて下さい
□投稿者/ さや (6回)-(2022/06/27(Mon) 16:59:08)
No99979 (WebSurfer さん) に返信
> ■No99975 (さや さん) に返信
>
>>この中にあるC#のサンプルがファイルを引数で渡して圧縮しており、その部分をファイル名ではなく
>>バイナリデータなどで渡して圧縮するようなDLLを作成しております。
>
> そのサンプルもファイルを読み込んでバイト列を取得しそれを圧縮しているのではないですか?
> であれば、ファイルを読み込んでバイト列を取得する部分が不要になるだけではないかと思うのですが。

度々のご返信ありがとうございます。
おっしゃるようにファイルを読めこんで内容を取得する部分を削るだけで出来ると思うのですが、私にソースを理解する知識が足りなくて苦戦している感じです。
まずは教えていただいたMemoryStreamを使って引数をバイナリーデータにして、元のソースに組み込んでみたいと思います。

引用返信 編集キー/
■99982 / inTopicNo.12)  Re[7]: FileStreamを使わない圧縮、解凍について教えて下さい
□投稿者/ WebSurfer (2502回)-(2022/06/27(Mon) 17:01:42)
No99981 (さや さん) に返信

> おっしゃるようにファイルを読めこんで内容を取得する部分を削るだけで出来ると思うのですが、

差し支えなければその部分だけでもサンプルコードをアップしてもらった方が話が早そうです。
引用返信 編集キー/
■99986 / inTopicNo.13)  Re[8]: FileStreamを使わない圧縮、解凍について教えて下さい
□投稿者/ Hongliang (1243回)-(2022/06/27(Mon) 18:47:18)
> 圧縮は7zipのLZMA SDKを使って圧縮するよう指示されております。
> 7zipもイマイチよくわかっていなくて、7zipの中にLZMAがあるという認識でいいのか???という感じでLZMA SDKなら間違いないだろうと思いそちらをダウンロードしたしだいです。
LZMA SDKは結局指示があったのか自分で決めたのかどっちなんでしょう。

このSDKであれば、SevenZip.Compression.LZMA.Encoderは
Code(inStream, outStream, 略)
しか持っていないので、何かファイルを圧縮するならFileStreamをinStreamに渡すだけですが。
「画像や音声」はファイル以外の何かで渡されてくるのでしょうか?
あなたの担当箇所の入り口にどういう形でこの「画像や音声」が渡ってくるのか、というところをはっきりさせましょう。

// へえ、完全マネージで書かれてるんだ、LZMA。
引用返信 編集キー/
■99987 / inTopicNo.14)  Re[7]: FileStreamを使わない圧縮、解凍について教えて下さい
□投稿者/ 魔界の仮面弁士 (3414回)-(2022/06/27(Mon) 21:10:21)
No99981 (さや さん) に返信
> まずは教えていただいたMemoryStreamを使って引数をバイナリーデータにして、元のソースに組み込んでみたいと思います。

.zip や .7z ファイルを作ることが目的なのでは無く、
LZMA ストリームとしてのデータの圧縮・解凍が主目的でしょうか?
(LZMA SDK の LZMA ストリームと 7-Zip は非互換という認識です)

となれば、CRC ハッシュやファイルリスト等も不要でしょうし、
圧縮は、SevenZip.Compression.LZMA.Encoder クラスの Code メソッド
展開は、SevenZip.Compression.LZMA.Decoder クラスの Code メソッド
を呼ぶところを主軸として真似ていけば良いかと思います。


No99975 (さや さん) に返信
> この中にあるC#のサンプルがファイルを引数で渡して圧縮しており、
LzmaAlone.cs のことですかね。
本質的には Encoder / Decoder の基本部分だけ真似れば良い気がします。


とりあえず、byte[] で受け渡せるようにしてみました。
エンドマーカーや辞書サイズ等は、適宜調整してみてください。

public static byte[] CompressLZMA(byte[] rawBinary)
{
 var encoder = new SevenZip.Compression.LZMA.Encoder();
 encoder.SetCoderProperties(propIDs, properties);
 using (var outMem = new System.IO.MemoryStream())
 using (var writer = new System.IO.BinaryWriter(outMem))
 using (var inMem = new System.IO.MemoryStream(rawBinary))
 {
  encoder.WriteCoderProperties(outMem);
  writer.Write(System.Net.IPAddress.HostToNetworkOrder(rawBinary.LongLength));
  encoder.Code(inMem, outMem, rawBinary.LongLength, -1L, null);
  outMem.Flush();
  return outMem.ToArray();
 }
}

public static byte[] DecompressLZMA(byte[] compressedBinary)
{
 var decoder = new SevenZip.Compression.LZMA.Decoder();
 using (var outMem = new System.IO.MemoryStream())
 using (var inMem = new System.IO.MemoryStream(compressedBinary))
 using (var reader = new System.IO.BinaryReader(inMem))
 {
  byte[] properties = reader.ReadBytes(5);
  long fileLength = System.Net.IPAddress.NetworkToHostOrder(reader.ReadInt64());

  decoder.SetDecoderProperties(properties);
  decoder.Code(inMem, outMem, compressedBinary.LongLength, fileLength, null);
  outMem.Flush();
  return outMem.ToArray();
 }
}


// ジェネリックな OrderedDictionary が欲しいところ
private static readonly SevenZip.CoderPropID[] propIDs = {
 SevenZip.CoderPropID.DictionarySize,
 SevenZip.CoderPropID.PosStateBits,
 SevenZip.CoderPropID.LitContextBits,
 SevenZip.CoderPropID.LitPosBits,
 SevenZip.CoderPropID.Algorithm,
 SevenZip.CoderPropID.NumFastBytes,
 SevenZip.CoderPropID.MatchFinder,
 SevenZip.CoderPropID.EndMarker,
};
private static readonly object[] properties = {
 (int)(1 << 23), // Dictionary Size
 (int)2, // postion state bit (0〜4)
 (int)3, // literal context bits (0〜8)
 (int)0, // literal position bits (0〜4)
 (int)2, // algorithm
 (int)128, // fast bytes for LZ*
 "bt4", // match finder ("BT2", "BT4", "BT4B")
 false // end marker
};
引用返信 編集キー/
■99989 / inTopicNo.15)  Re[8]: FileStreamを使わない圧縮、解凍について教えて下さい
□投稿者/ 魔界の仮面弁士 (3416回)-(2022/06/27(Mon) 21:46:19)
No99987 (魔界の仮面弁士) に追記
> とりあえず、byte[] で受け渡せるようにしてみました。

調べてみたら、わざわざ書かなくとも既存の C# 実装が多数あるようで…。

===
https://gist.github.com/ststeiger/cb9750664952f775a341
LZMA SDK に、上記の SevenZipHelper.cs というラッパー クラスを追加するだけで、
バイナリをインメモリ圧縮/解凍できるメソッドが手に入ります。

byte[] SevenZip.Compression.LZMA.SevenZipHelper.Compress(  byte[] inputBytes )
byte[] SevenZip.Compression.LZMA.SevenZipHelper.Decompress( byte[] inputBytes )

byte[] SevenZip.Compression.LZMA.SevenZipHelper.Compress(  string inFileName )
byte[] SevenZip.Compression.LZMA.SevenZipHelper.Decompress( string inFileName )

void SevenZip.Compression.LZMA.SevenZipHelper.Compress(  string inFileName, string outFileName )
void SevenZip.Compression.LZMA.SevenZipHelper.Decompress( string inFileName, string outFileName )


===
https://github.com/CCob/dnMerge/blob/master/dnMerge/Inject/7zip/SevenZipHelper.cs
こちらもほぼ同じですが、バイナリのみでファイル受け渡しは無し。

byte[] SevenZip.Compression.LZMA.SevenZipHelper.Compress(  byte[] inputBytes )
byte[] SevenZip.Compression.LZMA.SevenZipHelper.Decompress( byte[] inputBytes )


===
https://github.com/episage/lzma-compressor/blob/master/SevenZipHelper.cs
こちらの SevenZipHelper.cs 実装は Stream 前提。

void SevenZip.Helper.Compress(  Stream inStream, Stream outStream )
void SevenZip.Helper.Decompress( Stream inStream, Stream outStream )
引用返信 編集キー/
■99990 / inTopicNo.16)  Re[8]: FileStreamを使わない圧縮、解凍について教えて下さい
□投稿者/ さや (7回)-(2022/06/28(Tue) 09:30:49)
No99982 (WebSurfer さん) に返信
> ■No99981 (さや さん) に返信
>
>>おっしゃるようにファイルを読めこんで内容を取得する部分を削るだけで出来ると思うのですが、
>
> 差し支えなければその部分だけでもサンプルコードをアップしてもらった方が話が早そうです。

おはようございます。
返信が遅くなり申し訳ありません。

https://sevenzip.osdn.jp/sdk.html

ここからLZMA SDKをダウンロードし、\CS\7zip\Compress\LzmaAloneをサンプルとして見ています。

引用返信 編集キー/
■99992 / inTopicNo.17)  Re[9]: FileStreamを使わない圧縮、解凍について教えて下さい
□投稿者/ さや (8回)-(2022/06/28(Tue) 09:46:45)
No99986 (Hongliang さん) に返信

> LZMA SDKは結局指示があったのか自分で決めたのかどっちなんでしょう。

最新の圧縮技術を調べて使うよう指示されましたが調べてもよくわからず、上司が軽く調べてLZMAが最新って書いてあるからLZMAでいいんじゃない?と言われてLZMAを使うことになりました。
そこから「LZMA」で検索などしてLZMA SDKを見つけて自分でダウンロードした次第です。

> このSDKであれば、SevenZip.Compression.LZMA.Encoderは
> Code(inStream, outStream, 略)
> しか持っていないので、何かファイルを圧縮するならFileStreamをinStreamに渡すだけですが。
おっしゃる通り何も難しいことはしていないと思うのですが、FileStreamも知らなくて調べてやっとわかってきたところでして、デバックしたり皆様に教えていただいてやっと理解でき来ている状態です。

> 「画像や音声」はファイル以外の何かで渡されてくるのでしょうか?
> あなたの担当箇所の入り口にどういう形でこの「画像や音声」が渡ってくるのか、というところをはっきりさせましょう。
最終的にはQRコードからエンコード、デコードすることが目的です。
ただまだそのあたりの仕様は全く決まっていない状態でして、とりあえず最新の圧縮技術調べて使えるかテストしてみてという指示を受けております。
今までstringでの受け渡ししかしたことがなかったのでどうしていいのかわからず皆様を混乱させてしまい申し訳ありません。
こちらでのアドバイスを見て、バイナリで受け取るようプログラミングしたいと思います。

引用返信 編集キー/
■99993 / inTopicNo.18)  Re[8]: FileStreamを使わない圧縮、解凍について教えて下さい
□投稿者/ さや (9回)-(2022/06/28(Tue) 10:03:18)
No99987 (魔界の仮面弁士 さん) に返信

> .zip や .7z ファイルを作ることが目的なのでは無く、
> LZMA ストリームとしてのデータの圧縮・解凍が主目的でしょうか?
> (LZMA SDK の LZMA ストリームと 7-Zip は非互換という認識です)
はい、ファイル形式ではなくファイルに書かれる内容(それがストリームでしょうか。本当によくわかっておらず申し訳ありません)を返すDLLを作るよう指示されております。
最終目的はQRコードを読み込みそれをエンコード・デコードするということになります。
ただ、その部分の仕様は全く決まっていない状態でして、テストとしてvb.netで作ったファイルをZIPで圧縮解凍するプロジェクトのZIP部分をLZMAに変えてみるよう指示されております。
vb.netのプロジェクトでファイルの内容をバイナリデータでC#で作成したLZMAのDLLへ渡し、圧縮したらvb.netのプロジェクトへバイナリで返してそちらでファイルへ出力するという形にしたいと思っております。

> LzmaAlone.cs のことですかね。
はい、LzmaAloneを参考にしています。

> 本質的には Encoder / Decoder の基本部分だけ真似れば良い気がします。
> とりあえず、byte[] で受け渡せるようにしてみました。
> エンドマーカーや辞書サイズ等は、適宜調整してみてください。

ありがとうございます。
記載いただいたコードを解析してきちんと理解したいと思います。

引用返信 編集キー/
■99994 / inTopicNo.19)  Re[9]: FileStreamを使わない圧縮、解凍について教えて下さい
□投稿者/ さや (10回)-(2022/06/28(Tue) 10:06:42)
No99989 (魔界の仮面弁士 さん) に返信

> 調べてみたら、わざわざ書かなくとも既存の C# 実装が多数あるようで…。
そうなんですね!
リンク先など細かく教えていただきありがとうございます。
自分で調べても見つけられず、唯一見つけられたのがLZMA SDKだったのでそれを使ってどうにかしようと思っていました。

サンプルで記載いただいたソースとリンク先など見ながら理解していきたいと思います。
本当にありがとうございます。


引用返信 編集キー/
■99995 / inTopicNo.20)  Re[10]: FileStreamを使わない圧縮、解凍について教えて下さい
 
□投稿者/ radian (52回)-(2022/06/28(Tue) 10:32:08)
http://bbs.wankuma.com/index.cgi?mode=al2&namber=99936 と同じ人だと思うけど、
コロコロ名前変えるのはやめましょう。

No99994 (さや さん) に返信
> 自分で調べても見つけられず、唯一見つけられたのがLZMA SDKだったのでそれを使ってどうにかしようと思っていました。

ちなみに、どういうキーワードで調べたんですか?
面倒だからとりあえず丸投げしとこう感がプンプン伝わってきたので、前回の返答になりましたが。
SDK内のサンプルのnamespace "SevenZip.Compression.LZMA C#" で調べても、すぐサンプル出てきますよね。
狙ったコードが見つからないなら、更にキーワードを増やせばいいんです。

開発者の能力は調査する力による所が大きいので、まだ開発浅いのであれば、
多少時間掛かっても、きちんと今のうちに調査する力を養っておきましょう。
そうしないと、今回の件を乗り切った所で、また次の仕事で丸投げする事になりますよ。

あと、判らなければ、最初に一番身近な上司にまず相談するのが筋だと思います。
上司はあなたが全然出来ない事を知った上で仕事を振った訳ですよね。
全く手を付けられないなら、どこから手を付けるべきか
アドバイスくらいはしてくれるんじゃないですか?
こういった掲示板で答えだけ貰っても、あなたの能力の上昇には役に立ちません。
引用返信 編集キー/

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

次の20件>
トピック内ページ移動 / << 0 | 1 >>

管理者用

- Child Tree -