问题描述
|
在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的语句,因此不确定该怎么做。
解决方法
更新:正如其他张贴者所指出的那样(反对),这不是C#中字节序的解决方案。
C#条件编译指令
#if BIGENDIAN
uint32_t h;
uint32_t l;
#else
uint32_t l;
uint32_t h;
#endif
顺便说一句,您应该避免这些。使代码更难测试。
,由于无法将C#结构“存储映射”到原始数据,因此使用预处理器没有真正的优势。因此,尽管C#确实具有可用于其他目的的预处理器功能,但我认为它们对您没有用。
取而代之的是,只需要使用一种首选的结构,并为特殊情况埋下低级比特缠绕。这是结构的大端和小端处理示例:
将big-endian字节集合编组到结构中以提取值
,C#中有条件编译,但是您不能根据字节顺序使用它来获取不同的代码。对于托管语言,在编译时未知系统的流行程度。
编译器生成IL代码,该代码可以在大端和小端系统上执行。 JIT编译器负责将IL代码转换为本地机器代码,并将数字文字转换为正确的格式。
您可以使用BitConverter.IsLittleEndian
找出运行时的字节序。