問題タブ [binaryreader]

For questions regarding programming in ECMAScript (JavaScript/JS) and its various dialects/implementations (excluding ActionScript). Note JavaScript is NOT the same as Java! Please include all relevant tags on your question; e.g., [node.js], [jquery], [json], [reactjs], [angular], [ember.js], [vue.js], [typescript], [svelte], etc.

0 投票する
0 に答える
170 参照

c# - MFCArchiveFileReader と C# BinaryReader の違い

ファイルにデータを書き込む MFC で記述されたコードがあります。現在、そのコードを C# で書き直しています。MFC コードでは、データは CArchive を使用してファイルに書き込まれています。現在、C# で BinaryReader を使用してファイルからデータを読み取ることを考えています。

私の質問は、CArchive と BinaryReader は同じですか? そうでない場合、違いは何ですか。何を使用する必要がありますか。

私は MFC が苦手で、CArchive がバイナリ データをファイルに書き込むと想定しています。この仮定は正しいですか?

0 投票する
2 に答える
1873 参照

c# - BinaryReader c# を使用してファイルを最初から特定の位置まで読み取る

ファイルを使用してデータを保存しBinaryWriterました。

今、私はそのファイルから(特定の位置から始まる)データを読みたいと思っていBinaryReaderます

ファイルへの書き込み中に、ファイルの途中に文字列「BREAK」を追加しました。

C# で0 から 'BREAK' の前まで、および 'BREAK' のから OF FILE の終わりまでを読み取りたい。私を助けてください。

0 投票する
1 に答える
1082 参照

c# - BinaryReader の BaseStream の位置を変更すると、同じ BaseStream を使用する BinaryWriter の現在の状態にどのような影響がありますか?

ストリームを監視するパーサーに取り組んでいます(おそらくからNetworkStream)。ソース ストリームに特定のデータが表示されると、新しいストリームMemoryStreamが作成され、ソースからの関連データが書き込まれます。

次に、 for parse を として解析する別のクラス メソッドに渡しMemoryStreamます。このメソッドでは aが作成されます。実際にはデータの最後にあるため、データを読み取ろうとすると何もありません。MemoryStreamStreamBinaryReaderBinaryReader

BinaryReader にはPositionプロパティやSeekメソッドがないため、下線のBaseStream位置を変更する必要があります。位置が変更されると、ストリームを解析できます。

この場合、データを追加していないので問題ありません。しかし、同様の状況が発生し、追加のデータが書き込まれる場合、位置の値が背後で変更されたため、これが機能しない可能性があると思います。

ここでの意味については少しあいまいです。

書き込み側と読み取り側は、 のコピーBaseStreamとその位置、または元のオブジェクトの破損を許容していますか?

これは、ライターを作成すると同時にリーダーを作成する必要があることを意味しますBaseStreamか? これはより良い習慣かもしれないと思います。

BinaryReader と Writer は独自の位置情報を保持していますか? プロパティがそこにないからではありません。そうでない場合、同じスレッドで同時に使用できますか?

更新#1:その後撤回された回答とコメントに基づいて、混乱を少し明確にする必要があると思います。と の両方にBaseStreamプロパティがあります。ライターとリーダーの作成に使用されたストリーム オブジェクトを指していると思いました。両方に固有の単なるワーカーオブジェクトだと思い始めています。BinaryWriterBinaryReader

ソースとして複数のタイプのストリームにオープンなままでいるため、ストリーム オブジェクトについてはあまり想定したくありません。

更新 #2:いくつかのテスト コードを実行すると、それらが接続されていることがわかります。データが書き込まれると、リーダーの位置に影響します。ストリームの次の部分を読んで、中断したところから再開できるように、リーダーが影響を受けないままにしておくと便利だと思いました。私は次のようなものを想像しました:

  • データ イベントが発生します。このイベントにより、ライターによってデータが書き込まれます。
  • ある時点で、リーダーはストリーム内のデータの一部を処理します。
  • 別のイベントが発生して、さらにデータが書き込まれます。
  • リーダーが既に作業しているデータに追加されます。
  • リーダーは、新しいデータを含めて作業を終了します。

しかし、リーダーとライターの間で位置が機能する方法に基づいて、これはストリームが使用される方法ではありません。

おそらく私の概念の問題は、私の BaseStream が MemoryStream であり、ルールが NetworkStream の場合とは異なるためです。ストリームのソースの実装の詳細を読み取りクラスから除外しようとしていました。

この時点で、私は質問に対する答えを持っていると思います。ここで、ストリームを使用して頭の中にあるようなことを行うための情報を見つける必要があります。

0 投票する
1 に答える
2096 参照

c# - C# BinaryReader は著しく遅くなります。別?

私のプロジェクトでは、ファイルから UInt16、UInt32、Bytes、および Strings を書き込む必要があります。次のように書いた単純なクラスから始めました。

既存の BinaryReader を使用する方が良いかもしれないと思ったので試してみましたが、私のアプローチよりも遅いことに気付きました。誰かがこれがなぜなのかを説明できますか?また、ファイルをロードしてそこから読み取るために使用できる別の既存のクラスがある場合は?

~Adura

0 投票する
1 に答える
1116 参照

c# - バイトデータの解析中にエラーが発生してもループを続行する方法

私の質問はこれの続きです:(ファイルから非常に大きなバイト配列から異なるデータ型とサイズを読み取るためのループ)

ファイル (rawbytes.txt または bytes.data) に未加工のバイト ストリームが保存されており、これを解析して CSV スタイルのテキスト ファイルに出力する必要があります。

raw バイトの入力 (characters/long/int などとして読み取られる場合) は、次のようになります。

解析すると、次のようになります。

OutputA.txt

OutputB.txt

OutputC.txt

基本的に、これはバイトの 16 進ダンプ形式の入力であり、行末記号や解析が必要なデータ間のギャップがなく連続しています。上記のように、データは次々と異なるデータ型で構成されています。

これが私のコードのスニペットです - どのフィールドにもコンマがなく、"" (つまり CSV ラッパー) を使用する必要がないため、次のように TextWriter を使用して CSV スタイルのテキスト ファイルを作成しています。

私の質問は、生のバイト データの一部に null 値が含まれているという事実に基づいています。これは、解析が困難です。連続するデータ間に不明な数の null バイト (または null 以外の場違いなバイト) があるためです。ブロック (データ ブロックが破損していない場合は、それぞれ A、B、または C で始まります)。

質問

では、データの破損や欠陥が原因でエラーが発生した場合でもループを続行するには、デフォルトのケースまたはその他のメカニズムを追加するにはどうすればよいでしょうか? 次のコードは機能しますか?

残りの部分 - プログラムを停止せずに続行するためのコードを各スイッチ ケース (たとえば 'A') に追加する - 複数の try-catch ブロックなしでこれを行う方法はありますか? [つまり、コード ブロックの文字識別子は A ですが、A の後のバイトが破損しています。この場合、ループを終了するか、定義されたバイト数を読み取る (つまり、スキップする) 必要があります。ここでは、メッセージ ヘッダーが残りのバイトを正しく識別します。

[注: ケース A、B などでは、入力サイズが異なります。つまり、A は合計 40 バイトで、B は 50 バイトです。したがって、inputBuf[1000] や [50] などの固定サイズのバッファの使用は、たとえば、それらがすべて同じサイズである場合、うまく機能しません。

助言がありますか?助けてください!私はC#に比較的慣れていません(2か月)...

更新:私のコード全体は次のとおりです。

私が受け取るエラーは次のとおりです。

更新: 上記と同じエラーを生成するサンプル ファイルは、次のリンクにあります: http://www.wikisend.com/download/106394/rawbytes.txt

特に、データ ブロック ヘッダー (つまり、 inputCharIdentifier ) が有効であっても、連続するデータ ブロック間に予期しない 8 バイトの null バイトがあることに注意してください。このようなヘッダーに続くバイト数は常に予測不可能であり、一般的に変化します。私の問題は、次の利用可能な破損していないデータ ブロックが発生したときに、そのような状況を削除またはスキップできるようにする必要があることです。サンプル ファイルの場合、 8 個の場違いヌル バイト。

8 つのヌル バイトは、次のようにファイル内で見つけることができます: バイト カウンター: 1056 行 2、列 783 (Notepad++ による)

問題の核心は、8 つの null バイトが任意のサイズ (3、7、15、50 など) になる可能性があることです。これは、データ破損の直接的な結果として、常に不明です。しかし、「従来の」データ破損とは異なり、つまり、データブロック内の固定バイト数、たとえば 50 バイトが読み取れない可能性があるため、(正確なバイト数だけ) スキップすることができます - 私が直面するデータ破損は、有効なデータ ブロック間の不明なバイト数。

0 投票する
3 に答える
1809 参照

asp.net - 文字列に変換するとジャンクを返す BinaryReader.ReadBytes

なぜ私がやろうとしていることをしなければならないのかを説明しようとすると、時間がかかりますが、基本的には次のとおりです。ユーザーが Jpeg ファイルを選択するための FileUpload コントロールがあり、アップロードを行い、その後、そのファイルをバイトに変換し、それをイメージ コントロールのソースとして使用します。

私のコードはこれです:

バイト配列は問題ないように見えますが、それを文字列に変換すると、認識されない文字でいっぱいです。同じことを行う別のページがありますが、ファイルからバイトを取得する代わりに、MySql データベースから取得し、同じものを使用しますSystem.Text.Encoding.UTF8.GetString問題なく動作します。

更新 尋ねられたように、これは MySql データベースから取得するときに使用するコードです。

この SqlDataSource3 の選択は単純Select BIN_FOTO from temp_imageです。この値を Web カメラ キャプチャ WPF プログラムからデータベースに保存します。Web カメラがキャプチャした画像を変換するために使用するコードは次のとおりです。

base64次に、変数をデータベースに保存します。

これで私の問題が明確になることを願っています

0 投票する
1 に答える
764 参照

c# - C#ファイルの形式を知らずにバイナリテキストファイルを読み取る

さて、BinaryWriter を使用してバイナリ テキスト ファイルを作成しました。ドキュメントが不十分なため、ファイルの形式が失われました。

私は BinaryReader を使用してファイルを読み取りますが、これを行う唯一の方法は、ファイルをステップ実行して、BinaryReader クラスの ReadInt64()、ReadString() などを使用する必要があるかどうかを推測して試行錯誤することです。

ファイルをステップ実行して、次の値の形式を自動的に判断する方法はありますか?

0 投票する
2 に答える
163 参照

c# - コードで理解できない NetworkStream

画像の送信方法に関する以前の質問で助けを得ました。行われたことは、最初に画像の長さ(サイズ)を送信し、次に実際の画像を送信することでした。その後、いつ完了したかがわかります。

IT は次のようになります。

このコードは、前の質問で私を助けてくれた Angelo Geels からのものです。

さて、これをある意味で最適化しようとしました。そして、うまくいきます。ただし、ファイルが bmp (非圧縮) の場合のみで、その理由はわかりません。

したがって、PrintWindow はイメージをメモリストリームに保存して返します。したがって、ms = 私のイメージを含むメモリストリーム。

だから私にとってこれは完璧に機能するはずです.

ファイルのサイズ (メモリストリームの長さ) を送信します。次に、メモリストリームで byte[] データを送信します。

だから、それは同じことです。

ただし、bmp でのみ機能します。

私が考えることができる唯一のことは、圧縮形式で保存すると、bmpが最初に書き込まれてからエンコードされ、getbuffer()または何かが台無しになるということです。

しかし、私はまだそれが機能するはずだと思います。

0 投票する
1 に答える
1491 参照

c# - C#BinaryReaderは不明な構造からバイトを読み取ります

ディレクトリとファイル エントリを含むアーカイブ ファイルを読み込もうとしています。ファイルのヘッダーを読み込んで情報を取得することができました。

ここでフォーマットに関する情報を見つけることができます

現在、ファイルには、ファイルの起点から 2048 バイトの後に始まる目次モジュールが含まれています。

私が知っているのは、TOCには2つのものを含めることができるということです:

次の構造に従うディレクトリ エントリ:

  • 4bytes :int32 : エントリ名が格納されている場所の名前オフセット
  • 4bytes : int32 : 情報フラグ。4 バイトの各ビットには、何かに関する情報が含まれています。
  • 4bytes : Uint32 : コンテンツ エントリ インデックス
  • 4bytes : uint32 : コンテンツのエントリ数

ファイルエントリは次の構造に従います。

  • 4bytes : int32 : 名前のオフセット
  • 4bytes : int32 : ファイルサイズ
  • 3bytes : Uint24 : ファイルが保存されている場所のオフセット
  • 1byte : Uchar8 : リソースタイプ
  • 4byte : uint32 : 情報フラグ

これで、すべてのディレクトリ エントリまたはファイル エントリが同じになります。

問題は、目次の最初が何なのか、すべてのエントリの順序がわからないことです。不明です。

私が知っているのは、ファイルヘッダーからです。エントリ数と、エントリの数と目次のサイズです。

バイナリリーダーを使用して、すべてのエントリを読み取る必要がある形式を見つけたり、特定の種類のエントリを見つけたりする方法はありますか?

ヘッダーからエントリ数を知っているので、これには for ループを使用します。

どんな助けでも大歓迎です