在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这样的语句或者有ya的语句,所以不知道该怎么做。
答案 0 :(得分:4)
更新:正如其他海报所指出的那样(upvoted),这不是C#中字节序的解决方案。
C#Conditional compilation directives
#if BIGENDIAN
uint32_t h;
uint32_t l;
#else
uint32_t l;
uint32_t h;
#endif
顺便说一句,如果可以,你应该避免这些。使代码更难测试。
答案 1 :(得分:2)
C#中有条件编译,但根据endianess,你不能使用它来获取不同的代码。对于托管语言,系统的endianess在编译时是未知的。
编译器生成IL代码,可以在big endian和little endian系统上执行。它是JIT编译器,负责将IL代码转换为本机机器代码,并将数字文字转换为正确的格式。
您可以使用BitConverter.IsLittleEndian
在运行时查找结束语。
答案 2 :(得分:2)
由于您无法将C#结构“内存映射”为原始数据,因此使用预处理器没有真正的优势。因此,虽然C#确实具有可用于其他目的的预处理器功能,但我认为它们对您没有任何价值。
相反,只需使用一个首选结构,并为特殊情况埋下低级别的比特。以下是结构的big-endian和little-endian处理示例: