問題タブ [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.
.net - .NET でヌル終了文字列を逆シリアル化する最良の方法は何ですか?
一連の null で終わる文字列 (およびその他のバイナリ データ) としてシリアル化されたネットワーク接続からメッセージを読み取っています。
NULL が見つかるまで、BinaryReader を使用して一度に 1 文字ずつ読み取ることができました。
まだシンプルで効率的な方法はありますか?文字列の長さは 64 文字未満であると予想していますが、それよりも長くなる可能性があります。
c# - c#-6秒ごとに12kのデータで更新されるバイナリログファイルからの読み取り
センサー(Int16)からのストリーミングデータを含むバイナリログファイルがあります。
センサーが切断されるまで、6秒ごとにタイプInt16の6000サンプルが追加されます。
最後に読み取った位置から続けて、このファイルを定期的にポーリングする必要があります。a)ファイルストリームとバイナリリーダーを開いたままにして、読み取りの間にインスタンス化するb)読み取る必要があるたびにファイルストリームとバイナリリーダーをインスタンス化する(そして最後に読み取った位置を追跡するために外部変数を保持する)c)何か良いものがありますか?
編集:これまでのいくつかの素晴らしい提案は、「サーバー」アプリが外部のソースベンダーによって提供されており、変更できないことを追加する必要があります。
c# - Oracle DB へのアップロード前後のファイルの不一致
ユーザーがさまざまなファイル (HttpPostedFile) をアップロードできるように Web サイトを取得しようとしています。これらのファイルは、BLOB として Oracle データベースに格納されます。ここに私がこれまでに持っているものがあります:
ファイルは正常にアップロードおよびダウンロードされますが、ダウンロードされたファイルはアップロードされたファイルと同じではありません。コンテンツがデータベースに出入りするファイルと同じであることを既に確認しました。つまり、ファイルが正しく変換されていないか、クライアントによって正しく保存されていません。2 つのファイルのディスク上のサイズは同じですが、Windows では異なります。16 進エディタによると、ダウンロードされたファイルのコピーでは、ファイルの先頭で 3 バイトが欠落しているようです。
ファイルをクライアントに転送するために使用しているものは次のとおりです。Response.AddHeader("Content-Disposition", "attachment; filename=" + fileinfo[1]);
Response.AddHeader("Content-Length", filedata.Length.ToString());
Response.ContentType = "アプリケーション/オクテット ストリーム"; Response.BinaryWrite(ファイルデータ);
どんな助けでも大歓迎です。
c# - .NETでのより高速な(安全でない)BinaryReader
バイナリデータを読み取る必要があるかなり大きなファイルがあるという状況に遭遇しました。
その結果、.NETのデフォルトのBinaryReader実装はかなり遅いことに気づきました。.NET Reflectorでそれを見たとき、私はこれに出くわしました:
32ビットCPUが発明されて以来、コンピュータが32ビット値で動作するように設計されていることを考えると、これは非常に非効率的だと思います。
そこで、代わりに次のようなコードを使用して、独自の(安全でない)FastBinaryReaderクラスを作成しました。
これははるかに高速です-500MBのファイルを読み取るのにかかる時間を5〜7秒短縮できましたが、それでも全体的にかなり遅いです(最初は29秒、現在は約22秒FastBinaryReader
)。
このような比較的小さなファイルを読み取るのにまだ時間がかかる理由については、まだ少し戸惑っています。あるディスクから別のディスクにファイルをコピーする場合、数秒しかかからないため、ディスクスループットは問題になりません。
さらに、ReadInt32などの呼び出しをインライン化すると、次のコードになりました。
これをさらに速くする方法についてのさらなるアイデアはありますか?データは線形で、サイズが固定されており、シーケンシャルであるため、マーシャリングを使用して、ファイル全体をカスタム構造の上にあるメモリに直接マップできるのではないかと考えていました。
解決済み: FileStreamのbuffering/BufferedStreamに欠陥があるという結論に達しました。以下の承認された回答と私自身の回答(解決策を含む)を参照してください。
.net - バイナリ ファイル VB.NET の 0x00
以下に更新
VB.NET で BinaryReader を使用してバイナリ ファイルを読み込んでいます。ファイル内の各行の構造は次のとおりです。
問題は、「テキスト」フィールドにパディングに使用されるいくつかのファンキーな文字があることです。ほとんどが 0x00 ヌル文字のようです。
エンコーディングによってこれらの 0x00 文字を取り除く方法はありますか?
それ以外の場合、chText 配列を置換して 0x00 文字を取り除くにはどうすればよいですか? 結果のデータテーブルを XML にシリアル化しようとしていますが、これらの非準拠文字で失敗しています。配列をループすることはできますが、置換の方法がわかりません。
アップデート:
これは、以下の男性/ギャルからの多くの助けを借りて私がいる場所です. 最初のソリューションは機能しますが、期待したほど柔軟ではありません。2 番目のソリューションは 1 つのユース ケースで失敗しますが、はるかに一般的です。
広告 1) このサブルーチンに文字列を渡すことで問題を解決できます
広告 2) このルーチンはいくつかの問題のある文字を取り除きますが、0x00 では失敗します。これは、MSDN http://msdn.microsoft.com/en-us/library/kdcak6ye.aspxから改作されました。
c# - C# で BinaryWriter から書き込まれたデータを読み取るための C++ の BinaryReader はありますか?
C# の BinaryWriter を使用して、いくつかの int、char[] などをデータ ファイルに書き込みました。BinaryReader を使用して (C# で) ファイルを読み込むと、ファイルのすべての部分を完全に再作成できます。
ただし、C++ で読み戻そうとすると、恐ろしい結果が生じます。fstream を使用してデータを読み戻そうとしましたが、データが正しく読み込まれませんでした。C++ で fstream を設定し、ios::in|ios::binary|ios::ate
seekg を使用して自分の場所をターゲットにしました。次に、整数 "16" として書き込まれた次の 4 バイトを読み取ります (C# に正しく読み取ります)。これは、C++ では 1244780 と表示されます (メモリ アドレスではありません。確認しました)。これはなぜでしょうか?C++ の BinaryReader に相当するものはありますか? msdn で言及されていることに気付きましたが、それは Visual C++ であり、インテリセンスは私には c++ のようにも見えません。
ファイルを書き込むためのコード例 (C#):
データ ファイルを表示する方法がわかりません。
データを読み戻す例 (C#):
これはC++で実行したいです。最初の試行 (最初の整数で失敗):
編集:「seekg」を使用する場所に関係なく、まったく同じ値を受け取るようです。
c# - C# BinaryReader "ストリームはシーク操作をサポートしていません"
C# と ftpwebrequest を使用して、ftp サーバーからファイルをダウンロードしようとしています。BinaryReader を使用してバイトを取得できますが、br.ReadBytes(int) を使用してストリームを読み取ろうとすると、BinaryReader がシーク操作をサポートしていないというエラーが発生します。
ファイルに書き込むことができるように、バイトを読み取る最善の方法を知っている人はいますか?
完全な方法は次のとおりです。
これは進行中のサービスの一部として実行されるため、サービスを停止するエラーをスローしたくありません。代わりに、ログに書き込みます。このメソッドのログの内容は次のとおりです。
私はこの方法であまりにも長い間取り組んできたので、助けていただければ幸いです!
ありがとう!!
c# - データを読み取ろうとするときの奇妙な問題
私が書くとき:
...それは機能していますが、私が書くとき:
...動作していません。理由がわかりません。予期しない結果が得られます。メソッドは次のReadNext3Bytes
とおりです。
それはなぜですか、どうすれば修正できますか?
ありがとう。
c# - BinaryReader.ReadChars() に関する問題
BinaryReader.ReadChars() メソッドの問題であると思われる問題に遭遇しました。生のソケット NetworkStream に BinaryReader をラップすると、ストリームが破損し、読み取られているストリームが同期しなくなることがあります。問題のストリームには、バイナリ シリアル化プロトコルのメッセージが含まれています。
私はこれを次のように追跡しました
- Unicode 文字列 (Encoding.BigEndian を使用してエンコードされた) を読み取るときにのみ発生します。
- 問題の文字列が 2 つの tcp パケットに分割されている場合にのみ発生します (wireshark を使用して確認)。
何が起こっているかは次のとおりだと思います(以下の例のコンテキストで)
- BinaryReader.ReadChars() が呼び出され、3 文字を読み取るように要求されます (文字列の長さは、文字列自体の前にエンコードされます)。
- 最初のループは、ネットワーク ストリームから 6 バイト (残りの 3 文字 * 2 バイト/文字) の読み取りを内部的に要求します。
- ネットワーク ストリームには 3 バイトしかありません
- ローカル バッファに読み込まれた 3 バイト
- Decoderに渡されるバッファ
- デコーダーは 1 文字をデコードし、他のバイトを独自の内部バッファーに保持します。
- 2 番目のループは、4 バイトの読み取りを内部的に要求します。(残りの 2 文字 * 2 バイト/文字)
- ネットワーク ストリームには 4 バイトすべてが使用可能です
- ローカル バッファに読み込まれた 4 バイト
- Decoderに渡されるバッファ
- デコーダーは 2 char をデコードし、残りの 4 番目のバイトを内部で保持します。
- 文字列のデコードが完了しました
シリアライゼーション コードは、次の項目の非整列化を試み、ストリームの破損が原因で鳴きます。
/li>
ルートは、各ループで charsRemaining * bytes/char を使用して必要な残りのバイトを計算する .NET コードのバグだと思います。Decoder に余分なバイトが隠されているため、この計算は 1 だけオフになる可能性があり、入力ストリームから余分なバイトが消費されます。
問題の .NET フレームワーク コードは次のとおりです。
これがバグなのか、単に API の誤用なのか、完全にはわかりません。この問題を回避するには、必要なバイト数を自分で計算して読み取り、関連する Encoding.GetString() を介して byte[] を実行するだけです。ただし、これは UTF-8 などでは機能しません。
これについて人々の考えを聞いて、私が何か間違ったことをしているのかどうかに興味を持ってください. そしておそらく、次の人は数時間/数日の退屈なデバッグを節約できます.
編集:接続追跡アイテムを接続するために投稿されました