問題タブ [unsafe]
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.
c# - c#: アンマネージド配列をマネージド リストに一般的に変換する
動的に割り当てられた配列を介してデータを返す一連のネイティブ関数を扱っています。関数は参照ポインターを入力として取り、それを結果の配列にポイントします。
例えば:
呼び出しの後、'result' は null で終わる結果* の配列を指します。
このアンマネージド アレイからマネージド リストを作成したいと考えています。私は次のことができます:
これは機能しますが、処理する必要があるすべてのタイプの構造体 (~35) を再実装するのは面倒で醜い作業です。配列内の構造体の型に対して汎用的なソリューションが必要です。そのために、私は試しました:
ただし、「アドレスの取得、サイズの取得、またはマネージド型へのポインターの宣言 ('T')」ができないため、それはコンパイルされません。
また、安全でないコードを使用せずにこれを実行しようとしましたが、Marshal.Copy() がアンマネージ配列のサイズを知る必要があるという問題に遭遇しました。安全でないコードを使用してのみこれを判断できたので、この場合 Marshal.Copy() を使用するメリットはないように思われました。
私は何が欠けていますか?誰かがこの問題に対する一般的なアプローチを提案できますか?
c# - C#: ジェネリック ポインターを配列に変換する
byte*aを aに変換したいのbyte[]ですが、これを行うための再利用可能な関数も必要です。
残念ながら、T は「.NET 管理型」である可能性があり、それらへのポインターを持つことができないため、コンパイラ エラーが発生します。さらにイライラするのは、T を「管理されていない型」に制限できるジェネリック型の制約がないことです。これを行う組み込みの .NET 関数はありますか? 何か案は?
c# - Silverlight の BigEndianBitConverter?
Silverlight で MiscUtil.Conversion ユーティリティを使用しようとしています。 http://www.yoda.arachsys.com/csharp/miscutil/
コンパイルしようとすると、Silverlight の BitConverter クラスには次の 2 つのメソッドがないというエラーが表示されます。
DoubleToInt64Bits Int64BitsToDouble
さて、Reflector を開いて mscorlib で見つけました。
しかし、問題は、Silverlight ではアンセーフ コードが許可されないことです。プロジェクトのプロパティ メニューの [安全でないコードを許可する] の横に空のチェックボックスがありますが、値を変更することはできません。
Silverlight でこれを行うにはどうすればよいですか?
c - この機能はもっと安全ですか?ヒントとあなたの考えを探しています!
これは少し奇妙な質問です。
C関数を書きました。その「のような」strchr/strrchr。c文字列内の文字を検索することになっていますが、逆方向に移動して、その文字へのポインタを返します。c文字列は「nullで開始」されないため、3番目のパラメータ「count」も取ります。これは、逆方向に見る必要のある文字数を示します。
私はそれについていくつかのテストをしました、しかしあなたはそれに何か欠陥を見ますか?セキュリティの問題かそこら?何か機能強化はありますか?改善できますか?そしてもっと重要なのは、これは悪い考えですか?
いくつかの使用法。
編集:新しいインターフェース、いくつかの変更。
c# - C#のrefとoutはC++のポインタと同じですか?
次のように C# で Swap ルーチンを作成しました。
次の C++ コードと同じことを行います。
コードを使用せずに C# のポインタのようなrefandoutキーワードですか?unsafe
c# - C#で固定バイト/文字[100]をマネージド文字[]に変換する方法は?
C#で固定バイトまたはchar[100]をマネージドchar[]に変換する最良の方法は何ですか? 私はポインター演算を使用しなければならなくなったので、もっと簡単な方法があるかどうか疑問に思っています-memcpyまたは別の方法のようなものですか?
c# - .NETでのより高速な(安全でない)BinaryReader
バイナリデータを読み取る必要があるかなり大きなファイルがあるという状況に遭遇しました。
その結果、.NETのデフォルトのBinaryReader実装はかなり遅いことに気づきました。.NET Reflectorでそれを見たとき、私はこれに出くわしました:
32ビットCPUが発明されて以来、コンピュータが32ビット値で動作するように設計されていることを考えると、これは非常に非効率的だと思います。
そこで、代わりに次のようなコードを使用して、独自の(安全でない)FastBinaryReaderクラスを作成しました。
これははるかに高速です-500MBのファイルを読み取るのにかかる時間を5〜7秒短縮できましたが、それでも全体的にかなり遅いです(最初は29秒、現在は約22秒FastBinaryReader)。
このような比較的小さなファイルを読み取るのにまだ時間がかかる理由については、まだ少し戸惑っています。あるディスクから別のディスクにファイルをコピーする場合、数秒しかかからないため、ディスクスループットは問題になりません。
さらに、ReadInt32などの呼び出しをインライン化すると、次のコードになりました。
これをさらに速くする方法についてのさらなるアイデアはありますか?データは線形で、サイズが固定されており、シーケンシャルであるため、マーシャリングを使用して、ファイル全体をカスタム構造の上にあるメモリに直接マップできるのではないかと考えていました。
解決済み: FileStreamのbuffering/BufferedStreamに欠陥があるという結論に達しました。以下の承認された回答と私自身の回答(解決策を含む)を参照してください。
c# - .NETMicroFrameworkの安全でないコード
.NET Micro Frameworkは安全でないコードをサポートしていますか?つまり、.NET Micro Frameworkのコードでポインターを使用できますか?
c# - 一般的な BitConverter のような方法ですか?
最近、バイト配列からデータ型を読み取るジェネリック メソッドを作成する必要がある状況に遭遇しました。
次のクラスを作成しました。
さて、割り当て解除の問題は別として、このコードは次のメッセージでコンパイルされません。
where T : structメソッドの制約に基づいて上記の操作を実行できるはずなので、これは奇妙に思えます。
このコードがひどく間違っている場合、一連のバイトを取得して ' T' 型にキャストする簡単な方法はありますか?
ありがとう!