C#研究

2010年12月23日 (木)

ハッシュ値計算を途中経過取得可能な様に記述する

.NETで用意されているクラスを利用する事により、ハッシュ値の取得は簡単です。
例えばSHA-1なら、以下の記述で充分です。

/// <summary>
/// 指定ファイルのSHA1ハッシュ値を取得する。
/// </summary>
/// <param name="fileName">ハッシュ値を求めるファイルのパス</param>
/// <returns>SHA1ハッシュ値</returns>
public static byte[] SHA1(string file)
{
    using (FileStream fs = new FileStream(file, FileMode.Open, FileAccess.Read))
    {
        SHA1CryptoServiceProvider sha1 = new SHA1CryptoServiceProvider();
        sha1.ComputeHash(fs);
        return sha1.Hash;
    }
}

ただ、これだと計算途中に処理を中断出来ません。また、計算途中の進捗状況を表示したいといった場合とかでも、これでは対処出来ません。
こんなときは、TransformBlock / TransformFinalBlock を使用します。これを使用して記述すると、以下の様な記述となります。

/// <summary>
/// 指定ファイルのSHA1ハッシュ値を取得する。
/// </summary>
/// <param name="fileName">ハッシュ値を求めるファイルのパス</param>
/// <returns>SHA1ハッシュ値</returns>
public static byte[] SHA1(string file)
{
    using (FileStream fs = new FileStream(file, FileMode.Open, FileAccess.Read))
    {
        SHA1Managed sha1 = new SHA1Managed();
        byte[] buffer = new Byte[4096];
        int len = fs.Read(buffer, 0, buffer.Length);
        while (fs.Position < fs.Length)
        {
            sha1.TransformBlock(buffer, 0, len, buffer, 0);
            len = fs.Read(buffer, 0, buffer.Length);
        }
        sha1.TransformFinalBlock(buffer, 0, len);
        return sha1.Hash;
    }
}

余談ですが、最初 TransformBlock の引数指定でなぜ outputBuffer, outputOffset の指定がいるのか理解に苦しみました。どうやら暗号化クラスで使用している ICryptoTransform インターフェイスを使いまわしているだけの様です。実際使用してみると、outputBuffer は使用してないらしく、MSDNのサンプルの様に inputBuffer と同じバイト配列を指定して問題ない様です(バイト配列は書き換えられない)。

続きを読む "ハッシュ値計算を途中経過取得可能な様に記述する" »

2010年12月13日 (月)

7-zip32.dllでサロゲートペア文字を使用した場合の動作結果

※この記事を書いて間もない12/19に、7-zip32.dll Version 9.20.00.02 が公開されました。バージョン履歴の項に、『Unicode モード時に2バイト文字が化ける問題を修正。』とあり、改めてこのバージョンによる検証を行なった結果、このバージョンではサロゲートペアの文字化け問題は解決していました。従って、以下の記事はあくまでも Version 4.65.00.01 を対象としたものであり、最新バージョンでは問題ない事を踏まえた上で読んで下さい。

C#で 7-zip32.dll を使用してみたので、ついでながら、サロゲートペアを使用したファイル名の場合の動作確認も行なってみたいと思います。

続きを読む "7-zip32.dllでサロゲートペア文字を使用した場合の動作結果" »

2010年12月11日 (土)

7-zip32.dllのUTF-8モードをC#から使用する(2)

さて、前回保留していた書庫一覧の取得を行ないます。

続きを読む "7-zip32.dllのUTF-8モードをC#から使用する(2)" »

2010年12月 9日 (木)

7-zip32.dllのUTF-8モードをC#から使用する(1)

7-zip32.dll は、本来 7z 形式の書庫を扱うアンマネージドDLLですが、Zip 書庫自体も扱える様になっています。最新の 4.65.00.01 では、AESによる暗号化をサポートした事や、Zip 書庫でも UTF-8 のファイル名をサポートした事で、Zip 書庫操作用の DLL としても見逃せないものになっています。

さて、この 7-zip32.dll ですが、いざ Unicode ファイルを扱おうとすると、UTF-8 の文字コードを要求するので、C#では通常の呼び出し方が出来ません。

そこで、どうやればいいのかが、今回の研究テーマです。

続きを読む "7-zip32.dllのUTF-8モードをC#から使用する(1)" »

2010年12月 5日 (日)

「アイコンの変更」ダイアログを使ってみる。

アイコンネタ第4弾目です。今回は、タイトルの通り、下図のアイコンの変更ダイアログを出してみます。そして最終的にはコンポーネント化してみる事にします。

続きを読む "「アイコンの変更」ダイアログを使ってみる。" »

2010年11月16日 (火)

マネージドDLLの動的リンク(4)[最終回]

前回の最後で触れた様に、今回は、

  1. 「マネージドDLLの動的リンク(2)」で使用したハイブリッド型にインターフェースを加えて使用する方法
  2. 「マネージドDLLの動的リンク(3)」で使用したサブドメイン利用型でインターフェースを使用しない方法

について、研究します。

続きを読む "マネージドDLLの動的リンク(4)[最終回]" »

2010年11月14日 (日)

マネージドDLLの動的リンク(3)

マネージドDLLの動的リンク(2)の続きです。
前回、ハイブリッドタイプにする事により、動的リンクを実用的な範囲にする事ができましたが、今回は別の動的リンクによる方法を研究し、どちらが優れているかを検討したいと思います。

まずはじめに、今回の動的リンクの方法の元ネタとなったところを示します。
@IT > 旧@IT会議室 > Insider.NET > 動的DLLの解放について
http://www.atmarkit.co.jp/bbs/phpBB/viewtopic.php?topic=46665&forum=7

ここで示されているプログラムはVB.NETですが、リンクしたDLLを開放する事が可能になります。前回示したAssembly.LoadFileによるリンクでは、一度リンクしたらアプリケーション終了まで開放出来ませんから、その点でメリットを感じる場合もあるでしょう。

続きを読む "マネージドDLLの動的リンク(3)" »

2010年11月12日 (金)

マネージドDLLの動的リンク(2)

マネージドDLLの動的リンク(1)の続きです。
前回、直接 SharpZipLib を動的リンクして使用するのは、使い方にもよるものの、非現実的だと結論づけました。今回は、SharpZipLib のラッパークラスを作成し、ラッパークラスを動的リンクする事について考えてみます。

続きを読む "マネージドDLLの動的リンク(2)" »

2010年11月11日 (木)

マネージドDLLの動的リンク(1)

以前にアンマネージドDLLの動的リンクについて述べましたが、マネージドDLLの動的リンクはどうやるのかについて書きます。

アンマネージドDLLの動的リンクは、統合アーカイバプロジェクト関連のDLLの使用が目的でした。一方、マネージドDLL として、ZIP書庫を操作できる SharpZipLib というのが公開されています。この機能調査も含めて、動的リンクをしたらどうなるかも一緒にやってみました。

第1回目のこの回では、まずオーソドックスな方法(?)による動的リンクを使った方法に関する記事とします。

続きを読む "マネージドDLLの動的リンク(1)" »

2010年11月 3日 (水)

Sandcastle を使用したドキュメント作成(2)

Sandcastle を使用したドキュメント作成(1)の続きです。

まずはお詫びから。前回使用した bnote の「Sandcastleでドキュメントを作成する」 からダウンロードしたバッチファイルですが、オリジナルである %DXROOT%\Examples\sandcastle\build_Sandcastle.bat を多少手直ししたものと思っていたのですが、結構違いました。Sandcastle のバージョン差異によるものでしょうか。とにかく、本来と動きと違うことが判明しました。オリジナルの方をそのまま動かしても、ヘルプの文字化けは発生するのですが、XMLコメントの内容が反映されない点は、解決しましたので報告します。

この回の記事は全面書き直しと記事アップロードの遅延となってしまいました。申し訳ありません。また、前回記事もこれに伴い、これから修正を入れる予定です。

続きを読む "Sandcastle を使用したドキュメント作成(2)" »

その他のカテゴリー