2

C++ では、次のことができます。

struct {
#if defined (BIGENDIAN)
        uint32_t h;
        uint32_t l;
#else
        uint32_t l;
        uint32_t h;
#endif
    } dw;

さて、C# ではそれほど単純ではありません。BigEndian をテストする方法がありますが、コンパイル時に構造体を定義する方法があります。C# で同じ効果を得るにはどうすればよいでしょうか? 「BoardBig」や「BoardLittle」などのクラスを作成し、ファクトリを使用して、IsBigEndian チェックに基づいて必要なクラスを取得できると考えていました。_WIN64 チェックでは、「Position_64」や「Position_32」などのクラスを使用できます。これは良いアプローチですか?C# は #define IsBigEndian 1 などのステートメントを定義できないため、どうすればよいかわかりません。

4

3 に答える 3

4

更新:そして、他のポスターが指摘したように (賛成)、これは C# のエンディアンの解決策ではありません。

C#条件付きコンパイル ディレクティブ

  #if BIGENDIAN
      uint32_t h;    
      uint32_t l;
  #else
      uint32_t l;
      uint32_t h;        
  #endif

ところで、できればこれらを避けるべきです。コードのテストが難しくなります。

于 2011-05-24T03:04:28.767 に答える
2

C# には条件付きコンパイルがありますが、それを使用してエンディアンによって異なるコードを取得することはできません。マネージ言語の場合、システムのエンディアンはコンパイル時にはわかりません。

コンパイラは、ビッグ エンディアン システムとリトル エンディアン システムの両方で実行できる IL コードを生成します。IL コードをネイティブ マシン コードに変換し、数値リテラルを正しい形式に変換するのは、JIT コンパイラです。

BitConverter.IsLittleEndian実行時にエンディアンを調べるために使用できます。

于 2011-05-24T03:15:27.640 に答える
2

C# 構造を生データに「メモリ マップ」することはできないため、この目的でプリプロセッサを使用するメリットはありません。したがって、C# には他の目的に使用できるプリプロセッサ機能がありますが、ここではそれらが価値があるとは思いません。

代わりに、1 つの好ましい構造を使用して、特殊なケースの低レベルのビット操作を埋めてください。構造体のビッグ エンディアンとリトル エンディアンの処理の例を次に示します。

于 2011-05-24T03:17:41.547 に答える