9

par2 パリティ ファイルを使用して一連のファイルを修復できるようにする必要がある C# アプリを作成しています。C++ の場合は、まさにそれを実行できるものがたくさんありますが、C# の場合はネイティブ実装が見つかりません。

1 つのオプションは C# から C++ DLL を使用することですが、x64 アプリで 32 ビット dll を使用することはできないため、アプリを 32 ビット モードに制限することになるため、私はむしろそれを行いません。

別のオプションは、バックグラウンドで par2cmdline を shellexecute することですが、プロセス (進行、キャンセルなど) をより細かく制御したいと考えています。

par2 セットを使用してファイルを修復するネイティブ C# 実装を知っている人はいますか?

4

3 に答える 3

1

PAR自体を使い続けたいですか?私は完全にネイティブなリード/ソロモンの含意を持っていますが、それが役立つ場合は投稿します(PARが基づいている一致)が、すべてのファイル処理と分割については何もありません。

私のコードはStreamの実装であり、すべてのエラー訂正データが含まれる文字列を生成します。その後、そのデータを破損して送り返すことができ、システムは自動的にデータを回復します。投稿するだけですが、すぎてブログ投稿やリンクが面倒です。

これをPARのように機能させるには、それをファイルに分割してから、不足しているボリュームを識別し、不足しているすべてのデータの破損データを「追加」できるシステムを構築する必要があります(数学では不足しているデータを処理できず、破損しているだけです)。

また、パフォーマンスに関する注記として、これが構築されたシステムはかなり「バースト性」であり、一度に多数の100kストリームを取得しますが、何もしないのを長い間待ちます。数学のC#バージョンは、純粋なCバージョンよりも約6%高速に動作しました。ノンストップロードのみを使用してパフォーマンステストを行った場合、C#の実行速度は約1〜2%遅くなります。私の経験では、ほとんどのCからC#への数学変換で同じパフォーマンス結果が得られます。

于 2009-05-20T05:00:39.020 に答える
0

直接的な答えではありませんが、32 ビット dll を 64 ビット アプリにロードする方法があると思います。

http://dnjonline.com/article.aspx?ID=jun07_access3264

記事から:

このソリューションでは、32 ビット DLL をロードしてその API を公開する 32 ビット サロゲート プロセスを作成する必要があるため、追加の作業が必要です。また、消費者は 32 ビット DLL に直接アクセスする代わりに、IPC 技術のいずれかを使用する必要があるため、64 ビット側でもいくつかの変更が必要になります。極端な場合、この追加作業は、32 ビット DLL の 64 ビット バージョンをゼロから開発する作業に匹敵する可能性があることに注意してください。

これらのコストを削減する方法の 1 つは、元の 32 ビット DLL と同じ関数、パラメーター、型などを公開する 64 ビット ラッパー DLL を実装することです。このラッパー DLL は、代理プロセスに読み込まれた元の 32 ビット DLL に対して IPC ベースの呼び出しを行うことができます。

于 2009-05-19T08:41:38.323 に答える
0

昔、こんなことをしていました。par2 のソース コードを見ると、簡単ではありません。おそらく問題なく c# に移植できます。悲しいことに、必要なすべての労力は、パフォーマンスに多大な犠牲を払うことになります (信じられない場合は試してみてください)。

CreateProcess経由で実行可能なpar2を呼び出すことになりました。stdin、stdout、および strerr へのハンドルを取得できます。実行可能ファイルはコンソール アプリであるため、出力を解析して進行状況を取得できます。操作を「キャンセル」したい場合は、いつでもプロセスを強制終了できます。

ずさんな方法です。

「正しい」方法は、par2 ソースを取得して 64 ビット dll に移植することです (パフォーマンス上の理由から、アンマネージ C/C++ DLL を使用します)。

于 2009-05-19T14:06:29.900 に答える