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

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

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

Re[4]: バイナリファイルのZip保存に関して


(過去ログ 129 を表示中)

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

■76489 / inTopicNo.1)  バイナリファイルのZip保存に関して
  
□投稿者/ 初心者 (3回)-(2015/07/15(Wed) 14:18:32)

分類:[C#] 

開発環境は、

Visual Studio 2005
開発言語:C#
32-bit

すみません、わかる方いましたら御協力ください。
今やろうとしていることは、
バイナリファイル内に暗号化された情報が入っており、
それをZip保存→解凍→取り込むと通常の情報が取り込めるようになっております。

その為System.IO.FileStreamを使用し拡張子Zipにて保存を行っているのですが、
当たり前の話ですが、ZIpのヘッダー情報などがない為
解凍時にエラーとなってしまいます(解凍はIonic.Zip.dllを使用)

Lhaplusなどでは正常に解凍でき、
(ヘッダー情報を独自に追加してくれている?)
確かに解凍後のフォルダ内に
欲しい情報が入っている為、
解凍できれば最後までうまくいきそうなのですが、
その作成されたZipファイルにZipヘッダーを追加しようとしてみたり、
そもそもバイナリ―ファイルをきちんとZipにて保存できないか
色々試行錯誤している最中になります。

お聞きしたい点は2点になります。
@C#にてヘッダー情報を後から追加することは可能でしょうか。
A現在はZipファイル出力しておりますが、メモリー上で完結する事可能でしょうか?

わかるからいましたら宜しくお願いします。

引用返信 編集キー/
■76491 / inTopicNo.2)  Re[1]: バイナリファイルのZip保存に関して
□投稿者/ Hongliang (324回)-(2015/07/15(Wed) 14:56:39)
展開にIonic.Zip.dll使ってるんだったら、圧縮にも使えば良いんじゃないですか?
オンメモリでの処理にも対応していますし。
引用返信 編集キー/
■76493 / inTopicNo.3)  Re[2]: バイナリファイルのZip保存に関して
□投稿者/ ???S?? (1回)-(2015/07/15(Wed) 16:28:55)
No76491 (Hongliang さん) に返信
> 展開にIonic.Zip.dll使ってるんだったら、圧縮にも使えば良いんじゃないですか?
> オンメモリでの処理にも対応していますし。

御回答ありがとうございます。
試しに作ってみたのですが、
確かにtest.zipは解凍可能なのですが、
test.zipを解凍してもtestFile内部に保存されている情報の暗号化が解けず
解決しませんでした・・・

using (MemoryStream stream = new MemoryStream(bs))
{
using (ZipFile zip = new ZipFile())
{
zip.AddEntry("testFile", "", stream);
zip.Save(@"C:\test.zip");
}
}

やらなければいけないことはtestFileに拡張子を無理やりzipにし
無理やり展開すると暗号化が解ける仕組みみたいです・・・
Hongliang さんが仰ろうとしている事と勘違いして受け取っている場合はすみません・・・

引用返信 編集キー/
■76497 / inTopicNo.4)  Re[3]: バイナリファイルのZip保存に関して
□投稿者/ Azulean (502回)-(2015/07/15(Wed) 22:57:34)
第三者には答えづらい状況です。

・「暗号化」で何をやっているかわからない。そして、なぜそれが zip 展開ソフトで解凍できる理屈なのかわからず、実現できるかどうか回答不可能な状態となっている。
・zip 展開は一般的に「復号」ではありません。ゆえに、zip にすれば「無理矢理展開できる」と主張されている理屈がわかりません。

第三者に答えてもらいたいのであれば、情報を明らかにする必要があります。
情報を明らかにできないのであれば、第三者にアドバイスを求めず、その秘密を共有できる同僚・先輩とうまくやっていただくしかありません。

(zip 展開で解凍できる状態なら、単に復号(暗号化を解除)した状態のファイルを zip 圧縮すればできます。ただ、暗号化の意味はあるのか?という点で疑問です)
引用返信 編集キー/
■76499 / inTopicNo.5)  Re[4]: バイナリファイルのZip保存に関して
□投稿者/ Hongliang (325回)-(2015/07/15(Wed) 23:22:19)
可能性として。
それは暗号化ではなくて、gzip圧縮されているバイナリかもしれません。
もしそうであるならば、System.IO.Compression.GZipStreamを使うことで、(ionic.zip.dllなどを使用しなくても)元のバイナリに展開できます。
引用返信 編集キー/
■76501 / inTopicNo.6)  Re[4]: バイナリファイルのZip保存に関して
□投稿者/ 初心者 (6回)-(2015/07/16(Thu) 10:35:05)
No76497 (Azulean さん) に返信
> 第三者には答えづらい状況です。
>
> ・「暗号化」で何をやっているかわからない。そして、なぜそれが zip 展開ソフトで解凍できる理屈なのかわからず、実現できるかどうか回答不可能な状態となっている。
> ・zip 展開は一般的に「復号」ではありません。ゆえに、zip にすれば「無理矢理展開できる」と主張されている理屈がわかりません。
>
> 第三者に答えてもらいたいのであれば、情報を明らかにする必要があります。
> 情報を明らかにできないのであれば、第三者にアドバイスを求めず、その秘密を共有できる同僚・先輩とうまくやっていただくしかありません。
>
> (zip 展開で解凍できる状態なら、単に復号(暗号化を解除)した状態のファイルを zip 圧縮すればできます。ただ、暗号化の意味はあるのか?という点で疑問です)

御回答ありがとうございます。

> ・「暗号化」で何をやっているかわからない。

すみません、これは自分にもわかりません。
お客さんが独自に暗号化しており、Zipにし解凍してくれれば
解けると言われているだけなので・・・

>そして、なぜそれが zip 展開ソフトで解凍できる理屈なのかわからず、実現できるかどうか回答不可能な状態となっている。

これも不明です。
それがわからない為現在調査している
最中になります。
7-Zipでも解凍できたので、ソース確認した所
Zipヘッダー情報がない場合は
独自に追加している様でそれをC#で書ければ
開くのではないのかと調べているところです。

>第三者に答えてもらいたいのであれば、情報を明らかにする必要があります。
>情報を明らかにできないのであれば、第三者にアドバイスを求めず、その秘密を共有できる同僚・先輩とうまくやっていただくしかありません。

仰る通りで公開したいのですが、
自分も把握しているのは現在記載している物が全てになり、
試行錯誤している最中になります。


>(zip 展開で解凍できる状態なら、単に復号(暗号化を解除)した状態のファイルを zip 圧縮すればできます。ただ、暗号化の意味はあるのか?という点で疑問です)

上にも記載しましたが、
test.zip/testファイル(バイナリファイルから生成)を解凍した所、
testファイル自体はバイナリデータが残っているだけでした。
test.zip(バイナリファイルから生成)を解凍すると
testフォルダ/testファイル(暗号が解けた物)というファイルが生成され
testファイルより情報を取り出せるという仕組みになっているようです。


引用返信 編集キー/
■76502 / inTopicNo.7)  Re[5]: バイナリファイルのZip保存に関して
□投稿者/ 初心者 (7回)-(2015/07/16(Thu) 10:40:28)
No76499 (Hongliang さん) に返信
> 可能性として。
> それは暗号化ではなくて、gzip圧縮されているバイナリかもしれません。
> もしそうであるならば、System.IO.Compression.GZipStreamを使うことで、(ionic.zip.dllなどを使用しなくても)元のバイナリに展開できます。

回答ありがとうございます。
それも行ってみたのですが、
解除されませんでした。

テストソース

byte[] bs = System.Convert.FromBase64String(対象情報);
string gzipFileName = @"C:\testb.gzip";

//読み込んだデータを圧縮して書き込む
using (FileStream ofs = new FileStream(gzipFileName, FileMode.Create))
using (GZipStream gzipStream = new GZipStream(ofs, CompressionMode.Compress, true))
{
gzipStream.Write(bs, 0, bs.Length);
gzipStream.Close();
}


byte[] buffer = new byte[4096];

FileStream inStream = new FileStream(gzipFileName,
FileMode.Open, FileAccess.Read);
GZipStream gzStream = new GZipStream(inStream, CompressionMode.Decompress);

Regex reg = new Regex(@"\.gzip$");
string filename = reg.Replace(gzipFileName, "");

FileStream outStream = new FileStream(filename, FileMode.Create, FileAccess.Write);


C#は不慣れですので、Hongliangさんが仰ろうとしている回答に沿っていなかったらすみません・・・
引用返信 編集キー/
■76503 / inTopicNo.8)  Re[6]: バイナリファイルのZip保存に関して
□投稿者/ Hongliang (326回)-(2015/07/16(Thu) 10:51:00)
byte[] bs = System.Convert.FromBase64String(対象情報);
MemoryStream ms = new MemoryStream(bs);
GZipStream gzStream = new GZipStream(ms, CompressionMode.Decompress);
// gzStreamからReadすると、望んでいるデータを得られていませんか?

引用返信 編集キー/
■76504 / inTopicNo.9)  Re[7]: バイナリファイルのZip保存に関して
□投稿者/ 初心者 (9回)-(2015/07/16(Thu) 11:20:00)
No76503 (Hongliang さん) に返信
> byte[] bs = System.Convert.FromBase64String(対象情報);
> MemoryStream ms = new MemoryStream(bs);
> GZipStream gzStream = new GZipStream(ms, CompressionMode.Decompress);
> // gzStreamからReadすると、望んでいるデータを得られていませんか?



御回答ありがとうございます。

上記教えて頂いたソース + 読み込み処理行った所、
うまく取り込むことが出来ました。

テストソース


byte[] bs = System.Convert.FromBase64String(対象情報);
MemoryStream ms = new MemoryStream(bs);
GZipStream gzStream = new GZipStream(ms, CompressionMode.Decompress);


string gzipFileName = @"C:\test2";
System.IO.FileStream outFileStrm = new System.IO.FileStream(
gzipFileName, System.IO.FileMode.Create, System.IO.FileAccess.Write);

byte[] buffer = new byte[1024];
while (true)
{
int size = gzStream.Read(buffer, 0, buffer.Length);
//最後まで読み込んだら処理終了
if (size == 0)
break;
//ファイルに書き込む
outFileStrm.Write(buffer, 0, size );
}

//ファイル閉じる
outFileStrm.Close();


Hongliangさん、ありがとうございました!!!
本当に助かりました!!!


他の皆様も御回答ありがとうございました!!

C#はまだまだ不慣れでわからないことが多いですが、
自分も回答側に回れるよう頑張ってみます!!


解決済み
引用返信 編集キー/


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

このトピックに書きこむ

過去ログには書き込み不可

管理者用

- Child Tree -