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 或 what have ya 这样的语句,所以不知道该怎么做。

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 代码,可以在大端和小端系统上执行。JIT 编译器负责将 IL 代码转换为本地机器代码,并将数字文字转换为正确的格式。

您可以使用BitConverter.IsLittleEndian它在运行时找出字节序。

于 2011-05-24T03:15:27.640 回答
2

由于您不能将 C# 结构“内存映射”到原始数据,因此为此目的使用预处理器并没有真正的优势。因此,尽管 C# 确实具有可用于其他目的的预处理器功能,但我认为它们在这里对您没有价值。

相反,只需使用一种首选结构并为特殊情况隐藏低级位旋转。以下是结构的大端和小端处理示例:

于 2011-05-24T03:17:41.547 回答